Mein OOP Wissen ist ein wenig eingerostet ... und ich versuche, Polymorphismus 1. Mal mit Containern, denke ich.STL :: Container, Polymorphie
class car {
public: std::string color;
public: virtual void foo (void) = 0;
public: virtual ~car (void){}
};
class truck : public car {
public: int tonnage;
public: virtual void foo (void) {}
};
// expect for subclasses of car
...
truck *t = new truck();
t->color="white";
t->tonnage=32;
std::list <car *> lst; // for any kind of car
lst.push_back (t);
printf ("\n1: %s", typeid (t).name());
printf ("\n2: %s", typeid (lst.front()).name());
Ich erwartete
1: P3van
2: P3van
um zu sehen, aber es war
1: P3van
2: P3car
Ist das nicht möglich, mit Containern oder was ist das Problem? Ich muss die Unterklasse daraus, nicht die Eltern. Soweit ich gelesen habe, ist das nicht das Problem mit Zeigern. Danke für Hilfe!
EDIT1:
Ich habe virtuelle Funktionen. Aber es ist das gleiche Ergebnis.
EDIT2:
Ich mag würde mit der TypID-info zu niedergeschlagene. Ansonsten kann ich ein id-member in die Basis-Klasse einfügen, aber ich dachte, es wäre möglich (z. B. dynamic typecheck/cast).
Um Polymorphismus reallly arbeiten, haben die Basisklasse auf mindestens eine 'virtual' Funktion enthalten (die in polymorphen Zusammenhang sollte mindestens' virtual' destructor sein). – Zereges
Ihre Klassen sind nicht polymorph. Sie benutzen das einfache "ist a" Vererbungsverhältnis. Damit eine Gruppe von Klassen polymorph ist, müssen sie virtuelle Elementfunktionen haben. –
Und die Ausgabe ist korrekt. Der Inhalt der Listen ist ein Zeiger auf "Auto". Diese Zeiger können zu Zeigern auf "Lastwagen" heruntergerechnet werden, wenn sie wirklich "Lastwagen" -Instanzen sind. –