#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++ 再次让我感到惊讶 :)。
为什么会这样?如何为 vector 中的 Child 实例调用 Child::method,为 Parent 实例调用 Parent::method?
我正在使用 gcc:
gcc version 4.6.1 20110819 (prerelease) (GCC)
像这样:
g++ -Wall -Wextra -c main.cpp
g++ -Wall -Wextra -o main main.o
最佳答案
您遇到了切片问题。
vector<Parent>.push_back()
复制它的参数,所以它调用Parent::Parent(const Parent &)
(即复制构造函数)*。
这真的没有什么不同:
Parent x[10];
x[0] = Parent();
x[1] = Child();
* 或者可能是 Parent::operator=(const Parent &)
,即复制分配。我累了,我不记得它需要什么。
关于c++ - 在父类的 vector 上调用子类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313622/