Ich bin neugierig, warum in C++ 11, die Verwendung von "= Standard" auf einer abgeleiteten virtuellen Methode nicht die reine Basisklasse-Implementierung auswählen.C++ 11 = Standard-Schlüsselwort auf virtuelle Funktion zum Angeben von Standard-Pure-Implementierung
Zum Beispiel erzeugt der folgende Testcode die Meldung "Fehler: 'virtual void B :: tst()' kann nicht von" g ++ -std = C++ 11 "" vordefiniert werden ".
struct A {
virtual ~A() = default;
virtual void tst() = 0;
};
void A :: tst() {}
struct B : public A {
virtual void tst() = default;
};
Wir können natürlich eine B bieten :: tst, dass die Umsetzung Standardbasis aufruft, aber man befürchtet, dass dies könnte die höhere Aufwand Implementierung im Vergleich zu einer hypothetischen „= default“ basierte Kodierung.
Es tut uns leid, Fragen zu stellen, was vielleicht in den Köpfen der C++ - Normungskommissions-Personen liegt, aber trotzdem hat jemand hier bei Stack Overflow etwas Weisheit hinsichtlich der Unpraktikabilität der Verwendung des Standard-Schlüsselworts auf diese Weise interessant sein zu hören.
Danke!
Standardmäßig teilt eine untergeordnete Klasse die Implementierung des übergeordneten Elements, ohne etwas zu schreiben, vorausgesetzt, das untergeordnete Objekt erbt vom nicht-privaten Element. Also, in diesem Zusammenhang, was versuchst du '= default' zu haben? – md5i
Wenn die virtuelle Funktion rein ist, müssen die abgeleiteten Klassen eine Implementierung auswählen. Die abgeleitete Klasse kann eine Implementierung bereitstellen oder eine Standardimplementierung in der Basis aufrufen. Der Standardwert = könnte jedoch ermöglichen, dass der abgeleitete Wert den Basisstandardwert angibt, der vom Compiler in die vtable geladen wird. Dies wäre möglicherweise effizienter als die Verteilung an eine abgeleitete Implementierung, die sich umwandelt und an die Standardbasisimplementierung zurückruft. Ich halte es jedoch für eine wichtige Entwurfsoption, um die abgeleitete Klasse zur Kompilierungszeit auswählen zu lassen. –