Klassenhierarchie
-
Ich verstehe die Frage nicht...
Ganz normal:
list<A*>::iterator i=l.begin(); (*i)->print();
-
ok nehmen wir an
print() ist eine methode von meine unterklasse B. Aber die methode print existiert in A nicht. GEht das trotzdem?
-
Nein.
Nur Funktionen der Basisklasse können mit einem Zeiger auf diese aufgerufen
werden.
Außnahme: virtuelle FunktionenWenn du trotzdem eine Funktion aus Klasse B aufrufen willst, musst du den Zeiger
auf Klasse A in einen Zeiger auf Klasse B casten.
-
C Newbie, danke für den tip, wie mache ich das? bin etwas zu schwach in programmieren
-
virtuelle Funktionen:
class A { public: virtual void print(); } class B : public A { public: virtual void print(); } void A::print() { std::cout << "A"; } void B::print() { std::cout << "B"; } std::list<A*> l; A a; B b; l.push_back(&a); l.push_back(&b); for(list<A*>::iterator i=l.begin(); i != l.end(); ++i) { (*i)->print(); } // Gibt "AB" aus
Wenn du das nicht verstehst konsultiere das Tutorial deines Vertrauens.
-
Hi newbie, sorry ich merk schon du bist genervt, ich versteh das auch
aber schau dir das an:class A { public: virtual void print(); } class B : public A { public: virtual void print(); int func(); } void A::print() { std::cout << "A"; } void B::print() { std::cout << "B"; } std::list<A*> l; A a; B b; l.push_back(&a); l.push_back(&b); for(list<A*>::iterator i=l.begin(); i != l.end(); ++i) { (*i)->print(); } // Gibt "AB" aus
so, kannst du mir vielleicht sagen wie ich auf die methode von func von der Klasse B zugreifen kann?
-
Das ist nicht so schwer...
Du nimmst ein Objekt (Zeiger) vom Typ A*, den du explizit castest:B *ObjB = (B*)ObjA; int ret = (*ObjB).func();
mfg blueshift
-
class A {} class B : public A { public: int func(); } std::list<A*> l; B b; l.push_back(&b); list<A*>::iterator i=l.begin(); int retvalue = dynamic_cast<B*>(*i)->func();
Ich bin mir aber nicht sicher ob man einen Iterator wie einen Zeiger casten kann.
Iteratoren können als Zeiger implementiert werden, müssen es aber nicht. Darum solltest du noch auf eine zweite Meinung warten.
-
i ist im Prinzip ein 'Zeiger' auf ein Objekt. In unserem Fall ist dieses Objekt ein A*.
Deshalb muss es
dynamic_cast<B*>(*i);
heissen.Denn wir wollen nicht den iterator casten, sondern das Objekt, auf dass er zeigt.
-
Shade hat Recht.
Habs in meinem Post editiert.
-
Und weil der cast schiefgehen kann, wenn er grad nen Object C erschischt, ists besser:
class A {} class B : public A { public: int func(); } std::list<A*> l; B b; l.push_back(&b); list<A*>::iterator i=l.begin(); B * pTest = dynamic_cast<B*>(*i); if(pTest) { int retvalue = dynamic_cast<B*>(*i)->func(); // und was man sonst noch so anstellen will ... }
macht mans nicht, bekommt man gleich boese nen RT Error, falls man unsicher mit den typen war :p
Wichtig, dynamic_cast braucht die RTTI, muss man in manchen compilern / GUIs /Projekten erst einschalten, sonst meckert er beim compilieren ....
Ciao ...