Doch, das ist ein Teil der Lösung. Der andere Teil ist die Erkenntnis, dass in C++ Objekte auch per Kopie herumgereicht werden, während bei Java alles eine Referenz ist. (Vereinfacht ausgedrückt, bitte nicht korrigieren).
Was Du hier tust:
|
Quellcode
|
1
2
3
|
std::list<Object> objects;
Child myLittleChild;
objects.push_back( myLittleChild);
|
Du speicherst in der Liste ein richtiges Objekt, in dem Fall ist es eine Kopie der übergebenen Instanz myLittleChild. Da myLittleChild eine Instanz der Ableitung ist, die Liste aber nur Instanzen der Basisklasse speichern kann, wird nur der Basisklassen-Teil der übergebenen Instanz kopiert. Was Du hier brauchst, sind Referenzen. Bzw. Zeiger, da Referenzen in C++ semantisch anders sind als die in Java - man kann sie nicht in einen Container packen.
|
Quellcode
|
1
2
3
|
std::list<Object*> objects;
Child* myLittleChild = new Child;
objects.push_back( myLittleChild);
|
Wenn Du jetzt durch objects durchgehst und eine virtuelle Funktion der Basisklasse aufrufst, wird korrekt je nach tatsächlichem Typ die richtige Funktion aufgerufen.
|
Quellcode
|
1
2
|
for( auto obj : objects )
obj->DoSomething();
|
... müsste 0 oder 1 ergeben, je nach Typ der hinterlegten Instanz.
Warnung hier: Du musst im Gegensatz zu Java die Instanzen wieder mit delete abräumen, wenn Du sie mit new erzeugt hast. Oder Du nutzt std::shared_ptr zur automatischen Verwaltung des Speichers, was in begrenztem Maße ok ist.