Frage zu Mehrfachvererbung



  • Als aller erstes ist das so richtig:

    class A
    {
    public:
    	A(int i)
    	{
    	}
    };
    
    class B:
    	public virtual A
    {
    public:
    	B(int i):
    		A(i)
    	{
    	}
    };
    
    class C:
    	public virtual A
    {
    public:
    	C(int i):
    		A(i)
    	{
    	}
    };
    
    class D:
    	public B,public C
    {
    public:
    	D():A(1),B(2),C(3){
    	}
    };
    

    Mein Compiler schluck es ohne Anstand aber ich hatte neulich Probleme, dass mein Debugger bei solchen Konstruktionen an unvorhersehbaren Stellen abkackte also farg ich mal lieber ob ich das richtig verstanden habe.

    So nun meine eigentliche Frage folgendes ist die Klassenhierarchie:

    A
     / \
    B   C
     \ /
      D
     /|\
    E F G
    

    Gibt es da irgendeine Möglichkeit den Konstruktor für A in D aufzurufen anstatt in E, F und G drei Mal das gleiche tun zu müssen?



  • Warum baust du so eine Hierarchie überhaupt auf? Wenn du konkrete Ideen hast was du machen willst, dann lass uns daran teilhaben... Nur so kann man die perfekte Klassenhierarchie für dich finden.



  • Bienenstichsuppe schrieb:

    Warum baust du so eine Hierarchie überhaupt auf? Wenn du konkrete Ideen hast was du machen willst, dann lass uns daran teilhaben... Nur so kann man die perfekte Klassenhierarchie für dich finden.

    Wieso glaubst du, dass ich A, B, C, ... genommen habe 😉 . Ich will wissen wie das geht, dass es auch anders geht weis ich selbst.





  • Shade Of Mine schrieb:

    uU hilft ja das hier?

    Klingt gut, nur mag mein Kompiler das nicht so richtig. Letztes Code Beispiel, das mit virtual Vererbung, Copy&Paste:

    In constructor Derived::Derived(int, int)': 39: no matching function for call toUltimateBase::UltimateBase()'
    6: candidates are: UltimateBase::UltimateBase(const UltimateBase&)
    11: UltimateBase::UltimateBase(int)

    Compiler : gcc version 3.2.3 (mingw special 20030504-1)

    EDIT:
    Ich hab jetzt mal im Standard nachgeschlagen und hab folgendes gefunden:

    (12.6.2.6)
    All subobjects representing virtual base classes are initialized by the constructor of the most derived class(1.8). If the constructor of the most derived class does not specify a meminitializer for a virtual base class V, then V’s default constructor is called to initialize the virtual base class subobject. If V does not have an accessible default constructor, the initialization is illformed. A meminitializer naming a virtual base class shall be ignored during execution of the constructor of any class that is not the most derived class.

    dein Code ist also illformed.

    Allerdings heist das auch, dass man A wahrscheinlich nicht im Konstruktor von D aufrufen kann 😞 .


Anmelden zum Antworten