我希望从该接口继承几个类:
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
继承的类,例如Bob
和Alice
。
现在让我们说我想为Jack
,Bob
和Alice
创建一个容器,使我可以将它们重新组合到一个变量中。在这种状态下,对我来说是不可能的,因为IPlayer没有ctor,因此不能用作矢量或列表之类的对象的模板。 (至少这是我的理解)
最好在IPlayer
和Jack
之间有一个类,该类将仅实现ctor和dtor,然后将其他方法纯虚拟化,以供孩子利用;
OR
让IPlayer
(和/或任何将来的接口)从与上述相同的类继承,该类仅实现ctor和dtor只是为了使IPlayer
对于容器可变形?
答案 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);
}