Versiegeln einer virtuellen Funktion
Die Syntax zum Versiegeln einer virtuellen Funktion hat sich in Visual C++ 2010 im Vergleich zu Managed Extensions for C++ geändert.
Das __sealed-Schlüsselwort wird in Managed Extensions verwendet, um entweder einen Referenztyp zu ändern und dadurch eine nachfolgende Ableitung von diesem nicht zuzulassen (siehe Deklaration eines verwalteten Klassentyps) oder eine virtuelle Funktion zu ändern und dadurch das nachfolgende Überschreiben der Methode in einer abgeleiteten Klasse zu unterbinden. Beispiel:
__gc class base { public: virtual void f(); };
__gc class derived : public base {
public:
__sealed void f();
};
In diesem Beispiel überschreibt derived::f() die base::f()-Instanz auf Grundlage der genauen Übereinstimmung des Funktionsprototyps. Das __sealed-Schlüsselwort gibt an, dass in einer nachfolgenden, von der abgeleiteten Klasse geerbten Klasse eine Überschreibung von derived::f() nicht möglich ist.
In der neuen Syntax wird sealed nach der Signatur eingefügt und darf sich nicht mehr vor dem tatsächlichen Funktionsprototypen befinden, wie dies zuvor möglich war. Außerdem erfordert die Verwendung von sealed auch eine explizite Verwendung des virtual-Schlüsselworts. Das heißt, die korrekte Übersetzung von derived in obigem Beispiel lautet wie folgt:
ref class derived: public base {
public:
virtual void f() override sealed;
};
Das Fehlen des virtual-Schlüsselworts in dieser Instanz führt zu einem Fehler. In der neuen Syntax kann das Kontextschlüsselwort abstract anstelle von =0 verwendet werden, um eine rein virtuelle Funktion anzugeben. Dies wurde in Managed Extensions nicht unterstützt. Beispiel:
__gc class base { public: virtual void f()=0; };
kann umgeschrieben werden als
ref class base { public: virtual void f() abstract; };
Siehe auch
Referenz
Konzepte
Memberdeklarationen innerhalb einer Klasse oder Schnittstelle