首页 > 解决方案 > 如果对象在向量中,如何从子类访问父类中函数的子类版本?

问题描述

所以我有一个 ParentClass 和一个 ChildClass。我有一个矢量对象。我推回了其中的两个项目,一个 ParentClass newparent 对象和一个 ChildClass newchild 对象。我有一个 for-each 循环,我想从这个 for-each 循环中访问父函数的子版本函数,但我不能。请帮忙。

这是代码:

#include <iostream>
#include <vector>

using namespace std;

class ParentClass {
    public:

        int _a;

        ParentClass(int a) {
            this->_a = a;
        }

        void print_a() {
            cout << "parent a: " << this->_a << endl;
        }
};

class ChildClass: public ParentClass {
    public:

        ChildClass(int a) : ParentClass(a) {}

        void print_a(){
            cout << "child a: " << this->_a << endl;
        }
};

int main(int argc, char const *argv[]) {
    int x = 5, y = 6;
    vector<ParentClass> objects;

    ParentClass newparent(x); objects.push_back(newparent);
    ChildClass newchild(y); objects.push_back(newchild);

    for (auto obj : objects){
        obj.print_a();
    }

    return 0;
}

我希望它打印出“child a: 6”,但它会打印出“parent a: 5”和“parent a: 6”

标签: c++

解决方案


如果您有一个ParentCLass对象向量,它将ParentClass包含对象。当您添加 时ChildClass,C++ 将需要应用转换 -push_back需要ParentCLass const&. 找到的转换是标准的子到父转换;所以父部分被复制。

这称为“切片”。您可以创建一个std::vector<std::unique_ptr<ParentClass>>。这不会对对象进行切片,因为向量仅保存(智能)指向对象的指针。


推荐阅读