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()被覆盖,其中一个会打印“f from Foo”,另一个会打印“f from Bar”。但是,程序的输出是

f from Foo
f from Foo

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

4

4 回答 4

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

要获得多态优势,您应该使用指向派生对象的指针或引用。

于 2013-03-05T06:09:35.173 回答
1

这个

fooV.push_back(bar);

只复制Foo一部分bar- 一个struct Foo对象最终在里面vector。由于新对象是类型的,因此稍后会调用struct Foo它也就不足为奇了。Foo::f()

您只能存储一种不同类型的对象,vector因此对于您的情况,您必须存储指向对象的指针而不是对象本身。

于 2013-03-05T06:07:27.810 回答
0

你有一个向量FooBar向该向量添加 a只是将其中的Foo一部分复制Bar到向量中(忽略其他数据)。

于 2013-03-05T06:08:06.410 回答
0
vector<Foo> fooV;

当您创建 Foo 的向量时,Foo 的函数只会被称为而不是 Bar

于 2013-03-05T12:30:34.447 回答