?
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