c ++如何从一个函数中调用多个派生类的纯虚方法?

时间:2016-08-03 14:54:49

标签: c++

是否可以从循环中调用纯虚函数?

一些伪代码解释我试图实现的目标

(尝试了以下示例的一个版本,但得到了错误:抽象类类型的对象" Base"不允许)

class Base{
  public:
    virtual void printMe() =0;
};

class derivedOne{
  public:
    void printMe(){std::cout << "one "<<endl;
};

class derivedTwo{
  public:
    void printMe(){std::cout << "two"<<endl;
};

class holder{
  private:
   vector<derivedOne> one;
   vector<derivedTwo> two;
   void printDerive(vector<Base> bases){
      for (Base base: bases)
      {
        base.printMe();
      }
   };
};

所有派生类都实现了printMe函数(因为它是一个基本的纯虚函数)。 我试图避免为每个从基础实现printMe的类编写一个打印循环,因为这些函数都会做同样的事情(循环向量中的项并调用printMe)。

2 个答案:

答案 0 :(得分:3)

在基于范围的for循环中,您不能拥有vector<Base>Base base,因为Base是抽象的,并且这两者都需要构建Base

一种解决方案是为std::vector<std::unique_ptr<Base>>one存储two,以便您可以获得动态调度:

class holder{
private:
   std::vector<std::unique_ptr<Base>> one;
   std::vector<std::unique_ptr<Base>> two;
public:
   void printDerive(const std::vector<std::unique_ptr<Base>>& bases){
      for (auto&& base: bases)
      {
        base->printMe();
      }
   };
};

另一个选择是保持您的存储空间不变并具有模板功能来打印它们:

class holder{
private:
   std::vector<derivedOne> one;
   std::vector<derivedTwo> two;
public:
   template <class T>
   void printDerive(const std::vector<T>& ts){
      for (auto&& t: ts)
      {
        t.printMe();
      }
   };
};

这些解决方案会对您分配元素和使用向量产生影响,因此请根据您的其他要求进行选择。

答案 1 :(得分:0)

您的问题将是创建vector<Base>:这是不允许的,因为它需要实例化抽象类Base

你可以有vector指针作为基础,因为只有指针(和引用)可以表现多态(注意:你的函数应该采用vector通过const引用而不是值:

void printDerive(const vector<std::unique_ptr<Base>>& bases){
      for (auto& base: bases)
      {
        base->printMe();
      }
};