Referencia:C++ vector con la herencia
#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();
}
Al ejecutar ese código, se produce el siguiente resultado en mi equipo:
$ ./test
Func -> call()
Func -> call()
Func -> call()
Habría alguna manera de asegurar que la función virtual correcta se llama en este caso? Soy nuevo en C++, pero mi mejor conjetura es que aquí:
(*iter).call();
Se trata de ser arrojados a un objeto Func
. ¿Es esto correcto?
posible duplicado de [Almacenar dos clases con la misma clase base en un std :: vector] (http://stackoverflow.com/questions/8777724/store-two-classes-with-the-same-base-class -in-a-stdvector) –
sí, sin embargo no pude encontrar esa publicación antes de crear ésta, lo siento, mi búsqueda-fu no debe ser tan buena como la suya señor –
En su caso, está ocurriendo un corte de objetos, entonces la parte derivada se astilla. Debería utilizar Punteros de clase base para Almacenamiento de objetos heterogéneos. – Naveen