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
--
The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offense.
-- Edsger Wybe Dijkstra