Haben wir virtual table für eine abstract class?Hat eine abstrakte Klasse eine VTABLE?
Antwort
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.
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.
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.
Ich bezweifle, dass es einen Compiler gibt, für den das, was Sie sagen, tatsächlich wahr ist. –
Wow ... und dann wird der Compiler Sie ein schönes Abendessen kochen und Sie töten, nachdem Sie es beendet haben. –
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.
- 1. eine abstrakte Klasse erbt eine andere abstrakte Klasse Ausgabe
- 2. Sollte eine abstrakte Klasse mindestens eine abstrakte Methode haben?
- 3. Kann ich eine abstrakte Klasse ableiten, die eine andere abstrakte Klasse hat, die ebenfalls unterklassifiziert ist? (C#)
- 4. Eine abstrakte Methode überschreibt eine abstrakte Methode
- 5. Copykonstruktor: deep eine abstrakte Klasse Kopieren
- 6. Warum ist java.lang.Throwable nicht eine abstrakte Klasse?
- 7. Array von Zeigern auf eine abstrakte Klasse
- 8. Vertragsklasse sollte eine abstrakte Klasse sein
- 9. Hibernate-Mapping (XML) eine abstrakte Klasse
- 10. C++: Eine abstrakte Klasse als Mitglied
- 11. Kann eine abstrakte Klasse instanziiert werden?
- 12. Hat jedes Objekt der virtuellen Klasse einen Zeiger auf vtable?
- 13. Java abstrakte Klasse, abstrakte Konstruktor
- 14. Kann eine abstrakte Klasse eine endgültige Methode haben?
- 15. Hat ECMAScript 6 eine Konvention für abstrakte Klassen?
- 16. eine abstrakte Methode eines Kindes-Klasse von einer abstrakten Klasse
- 17. eine abstrakte Klasse Mocking von einer abstrakten Klasse abgeleitete
- 18. Update-Klasse, die eine andere Klasse hat
- 19. Rückgabe statische Element für virtuelle Funktion, fehlende vtable für abstrakte Klasse
- 20. Wie implementiert man eine abstrakte Klasse in F #?
- 21. Warum eine leere abstrakte Klasse anstelle einer Schnittstelle verwenden?
- 22. Abstraktion vs abstrakte Klasse
- 23. Mocking abstrakte Klasse, die Konstruktor Abhängigkeiten hat (mit Moq)
- 24. JMockit abstrakte Klasse Instanz
- 25. mockForConstraintsTests abstrakte groovy Klasse
- 26. Wie würde ich eine Unterklasse aus dieser abstrakten Klasse erstellen? Vtable Error
- 27. abstrakte Klasse Fehler einfach Klasse
- 28. Wie implementiert man eine abstrakte Klasse in Ruby?
- 29. Eclipse warnt "Variable wird nicht verwendet" auf eine abstrakte Klasse?
- 30. Rails: Wie find * für eine abstrakte Klasse implementieren?
Es ist fast sicher nicht. Siehe http://stackoverflow.com/questions/2156634/why-pure-virtual-function-is-initialized-by-0 –
oh, Junge, du hast es wörtlich genommen. ;) –