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
-
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
0xbffff9c0Wichtig 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
0xbffff9bcAlle 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