调用未知子类的虚方法

时间:2016-02-14 21:49:45

标签: c++ polymorphism abstract-class virtual-method

我有以下设置:

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

如何给孩子打电话? foos(他们可能是儿子或女儿)?我目前遇到两个错误:

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

1 个答案:

答案 0 :(得分:1)

首先,您必须将SonDaughter作为Parent的派生类:

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

然后,要获得多态对象的矢量,则无法将对象存储在其中。你必须使用指向对象的指针向量来实现多态性。

vector<Parent*> parents;

或更好:

vector<shared_ptr<Parent>> parents;

为什么?

  • 没有父对象可以实例化,因为它是一个抽象类。您只能创建它的派生类。
  • 如果Parent不是抽象的,那么你的代码可以工作,但是通过在向量中放置一个Son或一个子,它将是sliced