Hallo Liste!
Damit ich nicht der einzige bin, der lustige C++-Rätsel anzubieten hat:
Wie kann ich möglichst schmerzfrei den Typ einer abgeleiteten Klasse restaurieren, nachdem ich das Objekt in einem vector<virtualbaseclass> hatte? Ich weiß dabei nicht, welchen Typs das Objekt ist, nur die Basisklasse (geht ja aus dem vector hervor. Um das ganze mal zu illutrieren ein Beipiel:
virtuelle Basisklasse A, abgeleitete Klassen A1 und A2, vector<A>. A1 a1; A2 a2; vector<A> aa; aa.push_back(a1); aa.push_back(a2); aa[0].virtual_method() soll nun A1::virtual_method() referzieren und nicht A::virtual_method()...
Noch spezifischer:
---snip---------------- #include <iostream> #include <vector>
// basis klasse class A { public: virtual int x(void) {return 0;} };
// abgeleitet 1 class A1 : public A { public: virtual int x(void) {return 1;} };
// abgeleitet 2 class A2 : public A { public: virtual int x(void) {return 2;} };
int main(int argc, char* argv[]) { A a; A1 a1; A2 a2;
A &l = a; A &n = a1; A &m = a2;
std::vector<A> aa; aa.push_back(a); aa.push_back(a1); aa.push_back(a2);
cout << "direct: a=" << a.x() << " a1=" << a1.x() << " a2=" << a2.x() << "\n";
cout << "reference: a=" << l.x() << " a1=" << n.x() << " a2=" << m.x() << "\n";
cout << "from vec: a=" << aa[0].x() << " a1=" << aa[1].x() << " a2=" << aa[2].x() << "\n";
return 0; } ---snip----------------
ergibt:
direct: a=0 a1=1 a2=2 reference: a=0 a1=1 a2=2 from vec: a=0 a1=0 a2=0
Ich hätte in der letzten Zeile aber lieber from vec: a=0 a1=1 a2=2
Mach ich da irgendwas falsch? Kann man das irgendwie erreichen?
Gruß, Eric