2016-08-31 5 views
0

Lassen Sie sagen, ich habe folgende KlassenCompiler Hilfe in Zuweisungsoperator der Basis abgeleitet

class Base 
{ 
    // default CTOR 
    // default Copy Assignment 
}; 

class Derived : public Base 
{ 
public: 
    Derived() 
     // Calls base constructor 
    { 
     // implementation 
    } 

    Dervied& operator=(const Dervied& other) 
    { 
     A::operator = (other); // Why can't compiler offer this by default 

     // implementation 
    } 
}; 

Ich bin neugierig zu wissen, warum nicht Angebot Aufruf Basis des Zuweisungsoperators während abgeleiteter Zuweisung von Standard-Compiler können, warum müssen wir ausdrücklich auf nennen. Habe ich einen Fall übersehen, in dem dies (Aufruf von A :: operator = (other)) nicht erforderlich wäre.

Für Konstruktoren Compiler haben diese Berücksichtigung (d. H. Aufruf der Basiskonstruktor während der abgeleiteten Konstruktion).

+0

Ich verstehe nicht, wonach Sie fragen? All dies wird standardmäßig nur dann bereitgestellt, wenn Sie keine eigene Implementierung bereitstellen. –

+1

Ich denke, Sie könnten http://en.cppreference.com/w/cpp/language/using_declaration verwenden, zum Beispiel: mit Base :: operator =; – Roby

Antwort

0

Ich bin neugierig zu wissen, warum nicht standardmäßig Basis während abgeleitete Zuordnung Zuordnung Compiler kann

Angebot Aufruf Operator

Sobald Sie gehen Ihre eigene Implementierung zur Verfügung zu stellen, ist der Compiler aus Erraten was du eigentlich erreichen willst.

Während der Aufruf von A::operator = (other) wie eine vernünftige Standardoperation aussieht, können Sie dennoch etwas anderes implementieren. Der Compiler kann es nicht wissen und wird Sie nicht einschränken oder Ihnen dabei in die Quere kommen.

warum wir es explizit nennen müssen. Habe ich einen Fall übersehen, in dem dies (Aufruf von A :: operator = (other)) nicht erforderlich wäre.

Seien Sie einfach kreativ, ich könnte mir Fälle vorstellen, in denen Sie dieses Verhalten eigentlich überschreiben möchten.

+0

Mein Punkt ist, bietet die Implementierung für abgeleitete Mandate Entwickler zur Implementierung für die Basis angeben. Vernachlässigen Entwickler nicht, wenn sie die Implementierung von base aufrufen, besteht ein größeres Risiko als wenige kreative Szenarien. Der Compiler kann überprüfen, ob eine Basisimplementierung aufgerufen wird, und dann keinen Standardaufruf injizieren (ähnlich wie sich der Aufruf des Konstruktors von base verhält) – 0xffff

Verwandte Themen