调用未知的虚拟方法 child class

Calling virtual methods of unknown child class

我有以下设置:

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) {};
};

如果我有 vector<Parent> parents 并且我将通过带有循环的向量,如下所示:

for (int i = 0; i < parents.size(); i++) {
    Parent s = parents[i];
    s.foo(-1);  
}

如何称呼 children' foos(他们可能是儿子或女儿)?我目前收到两个错误:

  1. Variable type 'Parent' is an abstract
  2. Variable type 'Parent' is an abstract class

首先,您必须使 SonDaughter 派生出 class 的 Parent:

class Son : public Parent {
    ...
};
class Daughter : public Parent {
    ...
};

那么,要有一个多态对象的向量,你不能在其中存储对象。您必须采用指向对象的指针向量才能使多态性起作用。

vector<Parent*> parents;

或更好:

vector<shared_ptr<Parent>> parents;

为什么?

  • 无法实例化父对象,因为它是抽象的 class。您只能创建它的派生 classes。
  • 如果 Parent 不是抽象的,您的代码可以工作,但是通过将 Son 或 Daughter 放入向量中,它将是 sliced