在父类向量上调用子类的方法

时间:2011-09-05 23:40:25

标签: c++ oop vector polymorphism stdvector

#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

2 个答案:

答案 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。

如果你想利用多态性,请存储指针......但要确定它是你想要的。