虚拟重写函数未被调用

时间:2013-03-05 06:05:49

标签: c++ virtual

我正在尝试使用以下代码片段的多态性:

#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来自Bar”。但是,程序的输出是

f from Foo
f from Foo

我还应该注意,我还尝试将关键字override添加到f()Bar的声明中,因为我使用的是C ++ 11。它没有任何效果。

4 个答案:

答案 0 :(得分: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();
}

要实现多态性优势,您应该使用指针或对派生对象的引用。

答案 1 :(得分:1)

fooV.push_back(bar);

仅复制Foo的{​​{1}}部分 - bar对象最终在struct Foo内。由于新对象的类型为vector,因此稍后调用struct Foo也就不足为奇了。

您只能在Foo::f()中存储一种不同类型的对象,因此对于您的情况,您必须存储指向对象的指针而不是对象本身。

答案 2 :(得分:0)

你有一个Foo的向量。向该向量添加Bar只会将Foo的{​​{1}}部分复制到向量中(忽略其他数据)。

答案 3 :(得分:0)

vector<Foo> fooV;

当您创建Foot的矢量时,Food的功能将仅被称为Bar