2013-03-05 4 views
0

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

#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() переопределяется, один из них будет печатать «п от Foo» и другой «f из бара». Тем не менее, выход программы

f from Foo 
f from Foo 

Я хотел бы также отметить, что я также попытался добавить ключевое слово override к объявлению f() в Bar, так как я использую C++ 11. Это не имело никакого эффекта.

ответ

1

Это

fooV.push_back(bar); 

копии Foo часть bar только - это struct Foo объект заканчивается внутри vector. Так как новый объект имеет тип struct Foo, то неудивительно, что Foo::f() вызывается позже.

Вы можете хранить объекты только одного вида в vector, поэтому для вашего случая вам нужно будет хранить указатели на объекты вместо самих объектов.

0

У вас есть вектор Foo. Добавление Bar к этому вектору просто копирует Foo часть этого Bar в вектор (игнорируя другие данные).

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(); 
} 

Для достижения полиморфизм преимущества вы должны использовать указатели или ссылки на производные объекты.

0
vector<Foo> fooV; 

Как вы создаете вектор Foo то функция Foo будет вызываться только не Бара

Смежные вопросы