【问题标题】:How can I access child class version of functions in the parent class from the child class if the objects are in a vector? [duplicate]如果对象在向量中,如何从子类访问父类中函数的子类版本? [复制]
【发布时间】:2021-12-03 15:42:39
【问题描述】:

所以我有一个 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++


    【解决方案1】:

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

    这称为“切片”。您可以改为创建std::vector&lt;std::unique_ptr&lt;ParentClass&gt;&gt;。这不会对对象进行切片,因为向量只保存(智能)指向对象的指针。

    【讨论】:

    • 这行得通,谢谢。虽然我最终改用了 shared_ptr
    • @LindaniDlamini:我使用unique_ptr 假设向量将继续是对象的唯一所有者,就像在您的问题中一样,但实际上任何类型的指针都可以获取多态行为。
    • 这是有道理的。不过还是谢谢你
    【解决方案2】:

    在向量中使用指针或引用以使用多态性,它不适用于副本。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多