Виртуальная переопределенная функция не вызывается
Я пытаюсь немного с полиморфизмом с помощью следующего фрагмента кода:
#include <iostream>
#include <vector>
using namespace std;
struct Foo {
virtual void f() {
cout << "f from Foo" << endl;
}
};
struct Bar : public Foo {
void f() {
cout << "f from Bar" << endl;
}
};
int main() {
Foo foo;
Bar bar;
vector<Foo> fooV;
fooV.push_back(foo);
fooV.push_back(bar);
for(auto it = fooV.begin(); it != fooV.end(); ++it)
it->f();
}
Я ожидал, что с f()
переопределяется, один из них выведет "f из Foo", а другой "f из бара". Тем не менее, вывод программы
f from Foo
f from Foo
Следует также отметить, что я также попытался добавить ключевое слово override
к декларации f()
в Bar
, так как я использую C++11. Это не имело никакого эффекта.
4 ответа
Попробуй это
int main()
{
Foo foo;
Bar bar;
vector<Foo*> fooV;
fooV.push_back(&foo);
fooV.push_back(&bar);
for (auto it = fooV.begin(); it != fooV.end(); ++it)
(*it)->f();
}
Для достижения преимуществ полиморфизма вы должны использовать указатели или ссылки на производные объекты.
Это
fooV.push_back(bar);
копии Foo
часть bar
только - struct Foo
объект оказывается внутри vector
, Так как новый объект имеет тип struct Foo
это не удивительно Foo::f()
вызывается позже.
Вы можете хранить только объекты одного отдельного типа в vector
так что для вашего случая вам придется хранить указатели на объекты вместо самих объектов.
vector<Foo> fooV;
Поскольку вы создаете вектор Foo, функция Foo будет вызываться только не из Bar
У вас есть вектор Foo
, Добавление Bar
к этому вектору просто копирует Foo
часть этого Bar
в векторе (игнорируя другие данные).