class A {
int i;
public:
A() {cout<<"in A's def const\n";};
A(int k) {cout<<"In A const\n"; i = k; }
};
class B : virtual public A {
public:
B(){cout<<"in B's def const\n";};
B(int i) : A(i) {cout<<"in B const\n";}
};
class C : public B {
public:
C() {cout<<"in C def cstr\n";}
C(int i) : B(i) {cout<<"in C const\n";}
};
int main()
{
C c(2);
return 0;
}
Der Ausgang ist in diesem FallOrder of Konstruktoraufruf in virtuelle Vererbung
in A's def const
in B const
in C const
Warum dies nicht in der Eingabe in A const
`Es sollte die Reihenfolge von 1 arg Konstruktoraufruf folgen. Aber was passiert tatsächlich bei der Ableitung von B aus A mit virtuellen Schlüsselwort.
Es gibt einige Frage
Auch wenn ich das Schlüsselwort virtual in oben Programm entfernen und entfernen Sie alle Standardkonstruktors es Fehler gibt. Also, warum es den Def-Konstruktor benötigt
@james .... du meinst zu sagen, dass die am weitesten abgeleitete Klasse hier C C sollte den Initialisierer für A angeben. Aber beim Entfernen Ein Standardkonstruktor und Hinzufügen von C (int i): A (i), B (i) in Cs Konstruktor funktioniert es nicht – Kunal
@MikeDeSimone ... ya ich habe das selbe geschrieben, aber A's Standard-Konstruktor entfernt, aber ich bekomme Kompilierungsfehler ... können Sie bitte erklären, warum das so ist..und wie man vorsichtig ist, wenn ich habe eine komplexe Vererbung in. – Kunal
@Kunal: Ja, ich habe meinen Kommentar gelöscht, weil Sie es tatsächlich versucht haben. Also hier haben wir eine Antwort, abgestimmt, die nicht funktioniert. @James, bitte erkläre, wie man den Code repariert, damit der 'A (int)' -Konstruktor aufgerufen wird. –