2016-10-20 2 views
-1

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).

+0

Um Polymorphismus reallly arbeiten, haben die Basisklasse auf mindestens eine 'virtual' Funktion enthalten (die in polymorphen Zusammenhang sollte mindestens' virtual' destructor sein). – Zereges

+2

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. –

+1

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. –

Antwort

2

C++ definiert eine polymorphe Klasse als eine Klasse, die mindestens eine virtuelle Funktion. typeid macht nichts besonderes, außer wenn das Argument eine polymorphe Klasse ist. Also zuerst, fügen Sie einen virtuellen Destruktor zu car:

class car { 
    public: 
    virtual ~car() {} 
    std::string color; 
}; 

Auch typeid wirkt nicht polymorph auf Zeiger, nur auf Objekte/Referenzen. Versuchen

printf ("\n1: %s", typeid (*t).name()); 
printf ("\n2: %s", typeid (*lst.front()).name()); 
0

typeid() ist kein Mitglied Funktion der Klasse Auto. Also Polymorphismus gilt hier nicht. Rufen Sie anstelle von typeid (XXX) .name() XXX-> some_virtual_member_function() auf, und Sie werden sehen, worauf Sie gehofft haben.

Alternativ kann, wenn es nicht der Typ des Zeigers Sie gesucht haben, aber die Art des Objekts, sollten Sie typeid auf die Objekte rufen nicht die Zeiger.

z. anstelle von typeid (t), rufe typid (* t) auf.

+0

typeid wenn für die dynamische Typüberprüfung und so Teil von C++ – chris01

Verwandte Themen