Wir deklarieren eine reine virtuelle Funktion immer als:
virtual void fun () = 0 ;
Dh es wird immer 0 zugewiesen.
Ich verstehe, dass dies dazu dient, den vtable-Eintrag für diese Funktion auf NULL zu initialisieren, und jeder andere Wert hier führt zu einem Fehler bei der Kompilierung. Ist dieses Verständnis richtig oder nicht?
c++
abstract-class
pure-virtual
Mukeshkumar
quelle
quelle
virtual void func() = 100;
Antworten:
Der Grund
=0
dafür ist, dass Bjarne Stroustrup zum Zeitpunkt der Implementierung des Features nicht glaubte, dass er ein anderes Schlüsselwort wie "pure" hinter der C ++ - Community erhalten könnte. Dies wird in seinem Buch The Design & Evolution of C ++ , Abschnitt 13.2.3 beschrieben:Er erklärt auch ausdrücklich, dass dies den vtable-Eintrag nicht auf NULL setzen muss und dass dies nicht der beste Weg ist, reine virtuelle Funktionen zu implementieren.
quelle
Wie bei den meisten "Warum" -Fragen zum Design von C ++ ist der erste Blick auf das Design und die Evolution von C ++ von Bjarne Stroustrup 1 :
1 §13.2.3 Syntax
quelle
Abschnitt 9.2 des C ++ - Standards enthält die Syntax für Klassenmitglieder. Es enthält diese Produktion:
Der Wert hat nichts Besonderes. "= 0" ist nur die Syntax für "Diese Funktion ist rein virtuell". Es hat nichts mit Initialisierung oder Nullzeigern oder dem numerischen Wert Null zu tun, obwohl die Ähnlichkeit mit diesen Dingen einen mnemonischen Wert haben kann.
quelle
= 0
Was möchten Sie noch wissen? Es wäre dasselbe wie zu fragen, warum der Funktionskörper mit {} umschlossen ist. Die Antwort wäre, weil dies die C ++ - Syntax definiert.Ich bin mir nicht sicher, ob dahinter eine Bedeutung steckt. Es ist nur die Syntax der Sprache.
quelle
C ++ hat sich immer gescheut, neue Schlüsselwörter einzuführen, da neue reservierte Wörter alte Programme beschädigen, die diese Wörter als Bezeichner verwenden. Es wird oft als eine der Stärken der Sprache angesehen, dass sie alten Code so weit wie möglich respektiert.
Die
= 0
Syntax wurde zwar gewählt, da sie dem Festlegen eines vtable-Eintrags ähnelt0
, dies ist jedoch rein symbolisch. (Die meisten Compiler weisen solche vtable-Einträge einem Stub zu, der vor dem Abbrechen des Programms einen Fehler ausgibt.) Die Syntax wurde hauptsächlich gewählt, weil sie zuvor für nichts verwendet wurde und die Einführung eines neuen Schlüsselworts gespeichert wurde.quelle
pure
Schlüsselwort wäre in meinem Buch großartig gewesen. Wie auch immer, es ist gut, die Gründe zu verstehen.#define pure = 0
.C ++ muss eine Möglichkeit haben, eine reine virtuelle Funktion von einer Deklaration einer normalen virtuellen Funktion zu unterscheiden. Sie entschieden sich für die
= 0
Syntax. Sie hätten einfach das Gleiche tun können, indem sie ein reines Schlüsselwort hinzugefügt hätten. C ++ ist jedoch ziemlich abgeneigt, neue Schlüsselwörter hinzuzufügen, und bevorzugt die Verwendung anderer Mechanismen zur Einführung von Funktionen.quelle
In diesem Fall ist nichts "initiiert" oder "zugewiesen" Null.
= 0
in nur einem syntaktischen Konstrukt bestehend aus=
und0
Token, das absolut keine Beziehung zu Initialisierung oder Zuweisung hat.Es hat keine Beziehung zu einem tatsächlichen Wert in "vtable". Die C ++ - Sprache hat keine Vorstellung von "vtable" oder Ähnlichem. Verschiedene "vtables" sind nichts anderes als Details spezifischer Implementierungen.
quelle
Ich erinnere mich, dass ich gelesen habe, dass die Rechtfertigung für die lustige Syntax darin bestand, dass es einfacher war (in Bezug auf die Akzeptanz von Standards), als ein anderes Schlüsselwort einzuführen, das dasselbe tun würde.
Ich glaube, dies wurde in The Design and Evolution of C ++ von Bjarne Stroustrup erwähnt.
quelle
Ich würde annehmen, dass dies nur ein Teil der C ++ - Grammatik ist. Ich glaube nicht, dass es Einschränkungen gibt, wie die Compiler dies für ein bestimmtes Binärformat tatsächlich implementieren. Ihre Annahme war wahrscheinlich richtig für die frühen C ++ - Compiler.
quelle
Das
= 0
deklariert eine reine virtuelle Funktion .Ich denke nicht, dass das stimmt. Es ist nur eine spezielle Syntax. Die vtable ist implementierungsdefiniert. Niemand sagt, dass ein vtable-Eintrag für ein reines Mitglied bei der Erstellung tatsächlich auf Null gesetzt werden muss (obwohl die meisten Compiler vtables ähnlich behandeln).
quelle
= 0
müssen, ist, die gesamte Klasse abstrakt zu machen und virtuelle Aufrufe von reinen Funktionen zu verbieten . Nicht virtuelle Anrufe sind immer noch vollkommen in Ordnung, wenn die Definition (falls Sie eine angegeben haben) verwendet wird.__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… anstelle von Base :: f () ersetztNun, Sie können den vtable-Eintrag auch initialisieren, um auf eine tatsächliche Funktion zu verweisen. "
Es scheint intuitiv zu sein, dass der vtable-Eintrag entweder so definiert werden kann, dass er nirgendwo (0) oder auf eine Funktion zeigt. Wenn Sie Ihren eigenen Wert dafür angeben, wird dieser wahrscheinlich auf Müll anstatt auf eine Funktion verweisen. Aber deshalb ist "= 0" erlaubt und "= 1" nicht. Ich vermute, Neil Butterworth hat Recht damit, warum "= 0" überhaupt verwendet wird
quelle