Lets auf den folgenden Code aussehen:virtuelle Basisklasse ruft leeren Konstruktor in C++ (C++ 11)
class A{
protected:
int _val;
public:
A(){printf("calling A empty constructor\n");}
A(int val):_val(val){printf("calling A constructor (%d)\n", val);}
};
class B: virtual public A{
public:
B(){printf("calling B empty constructor\n");}
B(int val):A(val){printf("calling B constructor (%d)\n", val);}
};
class C: public B{
public:
C(){printf("calling C empty constructor\n");}
C(int val):B(val){printf("calling C constructor (%d)\n", val);}
};
int main(void) {
C test(2);
}
Die Ausgabe lautet:
calling A empty constructor
calling B constructor (2)
calling C constructor (2)
Könnte jemand mir erklären, warum die A-Klasse Konstruktor wird ohne Argumente aufgerufen? Zusätzliche wie kann ich dieses Verhalten "beheben", wenn ich möchte, dass die B-Klasse virtuell von A erbt? (Wenn die Vererbung nicht virtuell ist - das Beispiel funktioniert einwandfrei)
möglich Duplikat [Order of Konstruktoraufruf in virtuelle Vererbung] (http://stackoverflow.com/questions/10534228/order-of-constructor-call-in-virtual-inheritance) –
hat diesen wurde zu Tode diskutiert? –
Das Schlüsselwort 'virtual' in der Vererbung lässt den Konstruktor immer den Standardkonstruktor der Basisklasse aufrufen, auch wenn Sie in der Deklaration einen nicht standardmäßigen Konstruktor angegeben haben, basierend auf der Schlussfolgerung, dass die Basisklasse mehrmals in der Vererbungsstruktur angezeigt wird und Sie möchten nur, dass der Konstruktor einmal aufgerufen wird. Beachten Sie außerdem, dass der Standardkonstruktor aus der virtuellen Vererbung vor der normalen Vererbung aufgerufen wird, unabhängig von der Reihenfolge, die Sie angegeben haben. – Immueggpain