使用抽象类的容器保存子类

时间:2019-06-08 20:25:58

标签: c++ c++11 inheritance interface virtual-inheritance

我希望从该接口继承几个类:

class IPlayer {

public:
     virtual ~IPlayer() {}

     virtual void doSomething() = 0;

protected:
     std::string m_name;

};

这是一个需要从上面继承的类:

class Jack : public IPlayer {

public:
      Jack(std::string t_name)
      {
             m_name = t_name;
      }

      ~Jack() { }

      void doSomething()
      {
              /* do a bunch of stuff */
      }

};

请记住,我们还有其他以相同方式从IPlayer继承的类,例如BobAlice

现在让我们说我想为JackBobAlice创建一个容器,使我可以将它们重新组合到一个变量中。在这种状态下,对我来说是不可能的,因为IPlayer没有ctor,因此不能用作矢量或列表之类的对象的模板。 (至少这是我的理解)

最好在IPlayerJack之间有一个类,该类将仅实现ctor和dtor,然后将其他方法纯虚拟化,以供孩子利用;

OR

IPlayer(和/或任何将来的接口)从与上述相同的类继承,该类仅实现ctor和dtor只是为了使IPlayer对于容器可变形?

2 个答案:

答案 0 :(得分:1)

实际上,这些类没有问题。 x = (1,'one'), 可能是抽象类,但您无需创建此类的实例。只要向量的元素都指向非抽象子类,就可以完美地声明一个指向IPlayers的指针的向量。

IPlayer

由于没有创建IPlayer实例,因此此代码非常好。

答案 1 :(得分:0)

IPlayer可以有一个构造函数,实际上有一个由编译器提供的构造函数。

这是一种将播放器列表保持在IPlayer静态成员中的方法。但是列表不必在IPlayer中。

#include <memory>
#include <vector>

// forward declaration
class IPlayer;

using Players = std::vector<PlayerPtr>;

class IPlayer {
public:
    virtual ~IPlayer() {
    }
    static void addPlayer(IPlayer& player) {
        mPlayers.push_back(std::make_unique<IPlayer>(player));
    }
private:
    static Players mPlayers;
};

Players IPlayer::mPlayers;

class Bob : public IPlayer {
};

void run() {
    Bob bob;
    IPlayer::addPlayer(bob);
}