2010-04-07 10 views

Antwort

-2

Ja. Wenn Sie sagen:

virtual void foo() = 0; 

es ist fast wörtlich eine Zuordnung von 0 auf einen Eintrag in der V-Tabelle. Nimm das nicht zu wörtlich, aber es ist eine nette Art sich daran zu erinnern, was es bedeutet.

+4

Es ist fast sicher nicht. Siehe http://stackoverflow.com/questions/2156634/why-pure-virtual-function-is-initialized-by-0 –

+2

oh, Junge, du hast es wörtlich genommen. ;) –

16

Zunächst ist die Verwendung von vtables Implementierung definiert und nicht durch den Standard vorgeschrieben.

Für Implementierungen, die vtable verwenden, lautet die Antwort: Ja, normalerweise. Sie könnten denken, dass vtable nicht für abstrakte Klassen benötigt wird, da die abgeleitete Klasse ihre eigene vtable hat, aber während der Konstruktion benötigt wird: Während die Basisklasse konstruiert wird, setzt sie den vtable-Zeiger auf seine eigene vtable. Später, wenn der abgeleitete Klassenkonstruktor eingegeben wird, wird stattdessen eine eigene vtable verwendet.

Das heißt, in einigen Fällen wird dies nicht benötigt und die vtable kann weg optimiert werden. Zum Beispiel bietet MS Visual C++ das Flag __declspec(novtable), um die Generierung von vtable in reinen Interface-Klassen zu deaktivieren.

-6

Wir haben eine virtuelle Tabelle für eine Klasse, die mindestens eine virtuelle Funktion hat. diese virtuelle Funktion kann auch rein sein. das bedeutet. Eine Abstact-Klasse kann eine Vtable haben.

Bei abstact-Klassen ist der Eintrag vtable NULL. Wenn Sie versuchen, eine abstrakte Klasse zu instanziieren, wird sie in die Tabelle einchecken und prüfen, ob ein NULL-Wert vorhanden ist oder nicht. Wenn NULL vorhanden ist, löst der Compiler einen Fehler aus.

+3

Ich bezweifle, dass es einen Compiler gibt, für den das, was Sie sagen, tatsächlich wahr ist. –

+0

Wow ... und dann wird der Compiler Sie ein schönes Abendessen kochen und Sie töten, nachdem Sie es beendet haben. –

2

Es scheint hier ein allgemeines Missverständnis zu sein, und ich denke Spuren ihrer Quellen können immer noch online gefunden werden. Paul DiLascia wrote irgendwann im Jahr 2000, die -

... sehen, dass der Compiler erzeugt immer noch ein Vtable alle deren Einträge sind NULL und noch Code generiert die VTable im Konstruktor oder Destruktor für A zu initialisieren .

Das mag damals tatsächlich wahr gewesen sein, ist aber sicher nicht jetzt.

Ja, abstrakte Klassen haben Vtables, auch mit reinen abstrakten Methoden (diese können tatsächlich implementiert und aufgerufen werden), und ja - ihr Konstruktor initialisiert die reinen Einträge auf einen bestimmten Wert. Für VC++ mindestens, dieser Wert ist in der Adresse der CRT-Funktion _purecall. Sie können diesen Wert entweder durch overloading purecall yourself oder using _set_purecall_handler steuern.

Verwandte Themen