2016-05-12 12 views
0

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!

+0

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

+0

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. –

Antwort

1

Nach dem Standard §8.4.2/p1 Explizit ausgefallenen Funktionen [dcl.fct.def.default] (Hervorhebung von mir):

A function definition of the form:

attribute-specifier-seqopt decl-specifier-seqopt declarator virt-specifier-seqopt = default;

is called an explicitly-defaulted definition. A function that is explicitly defaulted shall

(1.1) — be a special member function,

(1.2) — have the same declared function type (except for possibly differing ref-qualifiers and except that in the case of a copy constructor or copy assignment operator, the parameter type may be “reference to non-const T”, where T is the name of the member function’s class) as if it had been implicitly declared, and

(1.3) — not have default arguments

Mitglied Funktion tst() ist keine special member function . Daher kann es nicht voreingestellt werden. Wenn eine Memberfunktion einer Klasse (z. B. class A) als rein virtuell angegeben wird, bedeutet dies, dass jede Klasse, die von dieser Klasse erbt und nicht möchte, dass sie ebenfalls abstrakt ist, diese Memberfunktion überschreiben muss.

+0

ok, der Standard sagt, dass diese Art von Standard-Implementierung der Basisklasse Standardauswahl nicht unterstützt wird, aber dennoch ist man neugierig, warum es nicht ist –