c++ - 在父类的 vector 上调用子类的方法

标签 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++ 再次让我感到惊讶 :)。
为什么会这样?如何为 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/

相关文章:

Android CMake 构建默认添加 no-exceptions 和 no-rtti

class - 如何在没有 initstate 的情况下使用异步值初始化 dart 类的私有(private)属性?

java - 什么是类、引用和对象?

javascript - 从 Javascript 的回调函数中调用对象函数

Vector 在 Rust 中存储混合类型的数据

c++ - 如何返回二维 vector ?

c++程序停止使用atof()

c++ - 如何在 C++ 中使用代理类执行 "opt-in"接口(interface)?

c++ - 如何通过键有效地合并 k 个排序的成对键/值 vector ?

c++ - 为什么输出包含 - 在这个程序中?