Private virtuelle Funktionen

Aktualisiert: November 2007

Private virtuelle Funktionen in abgeleiteten Klassen werden in Visual C++ 2008 anders behandelt als in Managed Extensions for C++.

In Managed Extensions schränkt die Zugriffsebene einer virtuellen Funktion nicht die Möglichkeit ein, diese Funktion innerhalb einer abgeleiteten Klasse zu überschreiben. In der neuen Syntax kann eine virtuelle Funktion keine virtuelle Funktion einer Basisklasse überschreiben, auf die sie keinen Zugriff hat. Beispiel:

__gc class Foo {
   // inaccessible to a derived class 
   virtual void g();
};

__gc class Bar : public Foo {
public:
   // in Managed Extensions, ok: g() overrides Foo::g()
   // in new syntax, error: cannot override: Foo::g() is inaccessible …
   void g();
};

Die neue Syntax enthält keine echte Entsprechung für diese Art von Design. Auf die Basisklassenmember muss zugegriffen werden können. Sie dürfen also nicht mehr privat sein. Die geerbten Methoden müssen nicht über denselben Zugriff verfügen. In diesem Beispiel besteht die Änderung mit den geringsten Nebenwirkungen darin, den Foo-Member protected zu machen. Dadurch bleibt dem allgemeinen Programm weiterhin der Zugriff auf die Methode über Foo verwehrt.

ref class Foo {
protected:
   virtual void g();
};

ref class Bar : Foo {
public:
   virtual void g() override;
};

Beachten Sie, dass das Weglassen des expliziten virtual-Schlüsselworts in der Basisklasse in der neuen Syntax zu einer Warnmeldung führt.

Siehe auch

Konzepte

Memberdeklarationen innerhalb einer Klasse oder Schnittstelle

Referenz

Member Visibility