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;)