std::vector zund vererbung
-
dann brauchst du aber ein std::vector<Alphabet *>
-
wenn ich keine zeiger benutzen will?
gibts da ne möglichkeit?
-
Nein. Nicht wenn du die Klassen in einen vector packen willst. Polymorphie funktioniert über Zeiger und Referenzen. Du kannst aber keine Referenzen in einen vector packen.
-
blubb schrieb:
wenn ich nun eine instanz von A oder B
in einen vector<Alphabet> packe
... dann hast du ein wunderbares Beispiel von dem was man Slicing nennt: Ein vector<Alphabet> speichert nur Alphabet-Objekte, und nur die. Wenn du ein A oder B Objekt in den vector packst, nimmt er nur den Alphabet-Teil davon, den Rest nicht. Deshalb ists kein Wunder, dass nur Alphabet::x() aufgerufen wird, denn das Objekt im vector IST eben nur ein Alphabet und nicht mehr. Wenn du polymorphe Objekte mittles vector verwalten willst musst du wie schon gesagt wurde auf Pointer (oder smartpointer oder Container wie boost::pointervector oder ähnliches) zurückgreifen.
-
oder du nimmst eine eigene containerklasse
class AlphabetContainer { public: AlphabetContainer(Alphabet *a) : p(a){} ~AlphabetContainer(){delete p;} Alphabet *operator -> (){return p;} Alphabet &operator * (){return *p;} private: Alphabet *p; }; std::vector<AlphabetContainer> vec; int main() { vec.push_back(new A); vec.push_back(new B); for (unsigned i = 0; i < vec.size(); ++i) vec[i]->Function(42.0001); }als beispiel(nicht perfekt da kein refcount)
-
ok kann mir wenigstens einer ein anwendungsbeispiel reinschreiben?
oder wie rufe ich dann auf?
B b; C c; vector<Alphabet*> v(2); v.push_back(&b); v.push_back(&c); ? *v[1].x(); ?
-
oder v[1]->x();
-
blubb? schrieb:
*v[1].x();Da der .-Operator stärker bindet als der Dereferenzierungsoperator musst du das ganze klammern:
(*v[1]).x();oder ganz einfach
v[1]->x();schließlich ist v[1] ein Zeiger wie jeder andere auch...
Übrigens: bei deinem Beispiel hast du v mit 2 initialisiert, d.h. zwei default-initialisierte Pointer (also nullpointer) befinden sich im vector. Danach fügst du mit push_back die beiden Pointer hinten an. v[1]->x() wird dir zur Laufzeit um die Ohren fliegen, da v[0] und v[1] nicht dereferenziert werden können...
-
herzlichen dank des klappt

und is noch einfach genug dass es ein anfänger verstehen kann
falls noch einer lust hat zu antworten:
ich hab keine ahnung was folgendes bedeutet:
p** is das ein zeiger auf einen zeiger?
-
ja, p** ist ein Zeiger auf einen Zeiger. In C kommt sowas des öfteren vor, in C++ sollte es eher eine Rarität sein (könnte mir grad keinen Grund vorstellen sowas zu verwenden)