#include <iostream>
#include <vector>
using namespace std;
class Parent {
public:
Parent();
void method();
};
class Child: public Parent {
public:
Child();
void method();
};
int main() {
vector<Parent> v;
v.push_back(Parent());
v.push_back(Child());
v[0].method();
v[1].method();
return 0;
}
Parent::Parent() {}
void Parent::method() {
cout << "Parent." << endl;
}
Child::Child() {}
void Child::method() {
cout << "Child." << endl;
}
基本上我希望打印程序
Parent.
Child.
但它会打印出来:
Parent.
Parent.
C ++再次让我感到惊讶:) 为什么会这样?如何在向量中为Child实例调用Child ::方法,为Parent实例调用Parent ::方法?
我正在使用gcc:
gcc version 4.6.1 20110819 (prerelease) (GCC)
像这样:
g++ -Wall -Wextra -c main.cpp
g++ -Wall -Wextra -o main main.o
答案 0 :(得分:4)
您遇到了切片问题。
vector<Parent>.push_back()
复制其参数,因此它调用Parent::Parent(const Parent &)
(即复制构造函数) * 。
这与以下内容完全没有区别:
Parent x[10];
x[0] = Parent();
x[1] = Child();
*或者它可能是Parent::operator=(const Parent &)
,即复制分配。我累了,我不记得它需要什么。
答案 1 :(得分:0)
向量存储Parent
s,而不是Children
s。
如果你想利用多态性,请存储指针......但要确定它是你想要的。