C++ 调用未知子类的虚拟方法

C++ 调用未知子类的虚拟方法,c++,polymorphism,abstract-class,virtual-functions,C++,Polymorphism,Abstract Class,Virtual Functions,我有以下设置: class Parent { virtual void foo(int x) = 0; }; class Son : public Parent { void foo(int x) {}; }; class Daughter : public Parent { virtual void foo(int x) {}; }; 如果我有向量父对象,并且我将使用循环遍历向量,如图所示: for (int i = 0; i < parents.size();

我有以下设置:

class Parent {
    virtual void foo(int x) = 0;
};
class Son : public Parent {
    void foo(int x) {};
};
class Daughter : public Parent {
    virtual void foo(int x) {};
};
如果我有
向量父对象
,并且我将使用循环遍历向量,如图所示:

for (int i = 0; i < parents.size(); i++) {
    Parent s = parents[i];
    s.foo(-1);  
}
for(int i=0;i
我怎么称呼孩子们的食物(他们可以是儿子或女儿)?我目前有两个错误:

  • 变量类型“Parent”是一种抽象类型
  • 变量类型“Parent”是一个抽象类

  • 首先,必须将
    子类
    子类
    作为
    父类
    的派生类:

    class Son : public Parent {
        ...
    };
    class Daughter : public Parent {
        ...
    };
    
    然后,要获得多态对象的向量,不能将对象存储在其中。要使多态性发挥作用,必须获取指向对象的指针向量

    vector<Parent*> parents;
    
    载体亲本;
    
    或者更好:

    vector<shared_ptr<Parent>> parents;
    
    载体亲本;
    
    为什么?

    • 无法实例化父对象,因为它是抽象类。您只能创建它的派生类
    • 如果父对象不是抽象的,那么代码就可以工作,但如果将子对象或子对象放入向量中,代码就可以工作

    我刚刚遗漏了:公共父部分。现在修复它。@Barry修复了我问题中的一个拼写错误,而不是真正的代码。