Referenzcode:C++ Vektor mit Vererbung
#include <vector>
#include <iostream>
class Func {
public:
virtual void call() {
std::cout<< "Func -> call()" << std::endl;
}
};
class Foo : public Func {
public:
void call() {
std::cout<< "Foo -> call()" << std::endl;
}
};
class Bar : public Func {
public:
void call() {
std::cout<< "Bar -> call()" << std::endl;
}
};
int main(int argc, char** argv) {
std::vector<Func> functors;
functors.push_back(Func());
functors.push_back(Foo());
functors.push_back(Bar());
std::vector<Func>::iterator iter;
for (iter = functors.begin(); iter != functors.end(); ++iter)
(*iter).call();
}
Wenn Sie sich diesen Code ausführen, erzeugt es die folgende Ausgabe auf meinem Computer:
$ ./test
Func -> call()
Func -> call()
Func -> call()
Wäre es eine Möglichkeit, dass die richtige virtuelle Funktion, um sicherzustellen, heißt in diesem Fall? Ich bin neu in C++, aber meine beste Vermutung ist, dass hier:
(*iter).call();
Es ist zu einem Func
Objekt geworfen wird. Ist das richtig?
möglich duplizieren von [Speichern Sie zwei Klassen mit derselben Basisklasse in einem std :: vector] (http://stackoverflow.com/questions/8777724/store-two-classes-with-the-same-base-class -in-stdvector) –
ja, es ist jedoch, ich konnte diesen Beitrag nicht finden, bevor ich diesen erstellt habe, sorry, mein Such-fu muss nicht so gut sein wie dein sir –
Es gibt Objekt-Slicing passiert in Ihrem Fall, So der abgeleitete Teil wird abgeblockt. Sie sollten Zeiger der Basisklasse für die Speicherung heterogener Objekte verwenden. – Naveen