我正在尝试使用以下代码片段的多态性:
#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。它没有任何效果。
答案 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