Mehrfachvererbung von gemeinsamer Basis aus



  • Wäre bei folgeder Klassenhierachie immer noch nur ein gemeinsames A-Objekt in jedem F-Objekt vorhanden?
    http://www.bilder-hochladen.net/files/thumbs/em9m-1.png


  • Mod

    Das sollte keine Probleme geben. Wichtig ist es, dass man die gemeinsame Klasse virtuell erbt, wenn man es wie hier mit dem diamond of death zu tun hat.



  • ok super danke für die schnelle Antwort



  • sollte das virtual dann nicht direkt unter F stehen?



  • hmm das wäre ungünstig^^



  • halo schrieb:

    hmm das wäre ungünstig^^

    Ist bei Dir die Basisklasse unten? Dann ist alles so, wie Du wünsch.



  • ja richtig Basisklasse ist A, danke für die für die Antworten 👍



  • So ich komme nochma auf diesen älteren Thread zurück:
    Würde es auch mit 3 virtual abgeleiteten Klassen Funktionieren?

    hier ein Bild zur Verdeutlichung:

    http://img812.imageshack.us/img812/4631/10904440.png

    In C soll es jetzt wieder nur ein gemeinsames A Objekt geben.



  • Warum nicht? - Ich wüsste nichts von einer Anzahl Beschränkung..



  • Ja, es funktioniert.

    Hier ein kurzes Beispiel:

    #include <iostream>
    class A{
    int a;
    };
    
    class B1 : virtual public A{
    };
    
    class B2 : virtual public A{
    };
    
    class B3 : virtual public A{
    };
    
    class C : public B1, public B2, public B3{
    };
    
    int main()
    {
            C c;
            A& aRef = c;
            B1& b1Ref = c;
            B2& b2Ref = c;
            B3& b3Ref = c;
            C& cRef = c;
            std::cout << &static_cast<A&>(aRef) << std::endl;
            std::cout << &static_cast<A&>(b1Ref) << std::endl;
            std::cout << &static_cast<A&>(b2Ref) << std::endl;
            std::cout << &static_cast<A&>(b3Ref) << std::endl;
            std::cout << &static_cast<A&>(cRef) << std::endl;
    }
    

    0xbffff9c0
    0xbffff9c0
    0xbffff9c0
    0xbffff9c0
    0xbffff9c0

    Wichtig dabei ist (afaik) nur die erste Vererbung:

    #include <iostream>
    class A{
    int a;
    };
    
    class B1 : virtual public A{
    };
    
    class B2 : virtual public A{
    };
    
    class B3 : virtual public A{
    };
    
    class C1 : public B1, public B2{
    };
    
    class C2 : public B2, public B3{
    };
    
    class D : public C1, public C2{
    };
    
    int main()
    {
            D d;
            A& aRef = d;
            C1& c1Ref = d;
            C2& c2Ref = d;
            B1& b1Ref = d;
            B2& b2Ref1 = c1Ref;
            B2& b2Ref2 = c2Ref;
            B3& b3Ref = d;
            D& dRef = d;
            std::cout << &static_cast<A&>(aRef) << std::endl;
            std::cout << &static_cast<A&>(b1Ref) << std::endl;
            std::cout << &static_cast<A&>(b2Ref1) << " " << &c1Ref << std::endl;
            std::cout << &static_cast<A&>(b2Ref2) << " " << &c2Ref << std::endl;
            std::cout << &static_cast<A&>(b3Ref) << std::endl;
            std::cout << &static_cast<A&>(c1Ref) << std::endl;
            std::cout << &static_cast<A&>(c2Ref) << std::endl;
            std::cout << &static_cast<A&>(dRef) << std::endl;
    }
    

    0xbffff9bc
    0xbffff9bc
    0xbffff9bc 0xbffff9ac
    0xbffff9bc 0xbffff9b4
    0xbffff9bc
    0xbffff9bc
    0xbffff9bc
    0xbffff9bc

    Alle besitzen das gleiche Basis-Objekt, obwohl es sich sogar bei c1Ref und c2Ref um Refenzen auf unterschiedliche Objekte handelt.

    Wann wird hier eigentlich die Australien-Fahne als Icon hinzugefügt?

    "Ozzie, Ozzie, Ozzie" - "Oi, oi, oi"
    "Ozzie, Ozzie, Ozzie" - "Oi, oi, oi"
    "Ozzie" - "Oi"
    "Ozzie" - "Oi"
    "Ozzie, Ozzie, Ozzie" - "Oi, oi, oi"

    EDIT: Member Variable in Klasse A hinzugefügt.

    Gruß aus DownUnder,
    CSpille


Anmelden zum Antworten