Fehlender Standart Konstruktur!?
-
Hallo Ich mal wieder:)
Ich habe folgenden Konstrukt:
class Base { public: Base(Base *p) {} virtual void X() = 0; }; class A :public virtual Base { int _i; public: A(int i, Base *p) :Base(p), _i(i) {} }; class B : public A { public: B(int i, Base *p) :A(i, NULL) { // < ---hier } void X() override {}; };
"Hier" meckert der Compiler , dass ein Standart-Konstruktor der Base fehlt !? Dieser Fehler tritt aber nur auf, wenn base "abstakt" ist bzw. einen virtualle methode hat?! Warum?
EDIT: Wenn ich B einen 2ten CTor gebe: (Was schwachsinnig wäre) geht es
B(int i, Base *p) :Base(p), A(i, NULL) { }
-
Das liegt daran, dass du virtuell vererbst. Das ist für Mehrfachvererbung gedacht, wo mehrere Basisklassen jeweils von einer gleichen Klasse erben (diamantförmige Vererbung). Dort muss explizit der Basis-Basiskonstruktor gerufen werden - ansonsten wird der Standardkonstruktor gerufen.
Lösung: vermeide den Diamant. Vererbe im Regelfall ohne virtual. (Die Funktion muss natürlich virtual bleiben)
Also hier das virtual weg:
class A :public virtual Base
-
@wob Ahh ok danke für den Tipp;)
-
Dieser Beitrag wurde gelöscht!
-
Dieser Beitrag wurde gelöscht!