Виртуальная переопределенная функция не вызывается

Я пытаюсь немного с полиморфизмом с помощью следующего фрагмента кода:

#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 в векторе (игнорируя другие данные).

Другие вопросы по тегам