Hier ist eine Klasse mit einer undefinierten Methode. Scheinbar erlauben Compiler, Instanzen dieser Klasse zu konstruieren, solange die undefinierte Member-Funktion niemals aufgerufen wird:
%Vor% Hier ist eine ähnliche Situation, aber eine, die Vererbung beinhaltet. Die Unterklasse Bar
erweitert die Basisklasse Foo
. Foo
definiert eine Methode g()
. Bar
deklariert die gleichnamige Methode, definiert sie aber nicht:
Hier ist eine Variation des Obigen. Der einzige Unterschied hier ist, dass g()
ist virtual
für beide Foo
und Bar
:
Siehe die Codekommentare für den Kontrast des unterschiedlichen Verhaltens zwischen VC2013 und g ++.
virtual
-Schlüsselwort im Vergleich zu dem in seiner Version ohne das virtual
-Schlüsselwort? Bar
's Deklaration von g()
als überschreibend gezählt
auch wenn Bar
keine Definition liefert? Welcher Compiler ist korrekt, falls vorhanden?
Sie haben beide Recht. Ihr Code ist falsch, keine Diagnose erforderlich. [klasse.virtual] / 11
Eine in einer Klasse deklarierte virtuelle Funktion soll definiert oder deklariert sein rein (10.4) in dieser Klasse oder beides; aber keine Diagnose ist erforderlich (3.2).
[intro.compliance] / 2:
Wenn ein Programm eine Regelverletzung enthält, für die keine Diagnose gilt Diese Internationale Norm verlangt keine Anforderungen Implementierungen in Bezug auf dieses Programm.
Sehen Sie sich Ihre Optimierungseinstellungen für GCC an, sie können das Verhalten beeinflussen.
Sind nicht verwendete undefinierte Methoden immer erlaubt?
Eine Elementfunktion muss genau dann definiert werden, wenn sie odr-used ist. [basic.def.odr] / 3:
Jedes Programm soll genau eine Definition von jedem Nicht-Inline enthalten Funktion oder Variable, die in diesem Programm verwendet wird; keine Diagnose erforderlich.
Betrachten Sie nun [basic.def.odr] / 2:
Ein Ausdruck wird möglicherweise ausgewertet , es sei denn, es handelt sich um einen unevaluierten Operanden (Abschnitt 5) oder einen Unterausdruck davon.
[...]
Eine virtuelle Mitgliedsfunktion wird odr-verwendet, wenn sie nicht rein ist.
Eine nicht überladene Funktion, deren Name als potenziell ausgewerteter Ausdruck oder als Mitglied einer Menge von Kandidatenfunktionen erscheint, wird, wenn sie durch Überladungsauflösung aus einem potenziell ausgewerteten Ausdruck ausgewählt wird, odr verwendet, es sei denn, es handelt sich um ein reines virtuelles Objekt Funktion und ihr Name ist nicht explizit qualifiziert.
Sie dürfen weiterhin nicht definierte nicht-virtuelle Elementfunktionen in decltype
oder sizeof
verwenden. Aber nicht-reine virtuelle Funktionen werden odr-einfach verwendet, weil sie nicht rein sind.
Zählt Bars Deklaration von g () auch bei Bar als überschreiben bietet keine Definition?
Ja.
Tags und Links c++ language-lawyer virtual-functions undefined-function