【发布时间】:2019-10-23 21:07:12
【问题描述】:
我想从这个接口继承几个类:
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。
现在假设我想为Jacks、Bobs 和Alices 创建一个容器,这样我就可以将它们重新组合到同一个变量中。在这种状态下,对我来说是不可能的,因为 IPlayer 没有 ctor,因此不能用作向量或列表等对象的模板。 (至少这是我的理解)
在IPlayer 和Jack 之间有一个类会更好吗,它只实现ctor 和dtor,然后让其他方法纯虚,供孩子们利用;
或
使IPlayer(和/或任何未来的接口)继承自与上述仅实现ctor和dtor相同的类,只是为了使IPlayer可用于容器?
【问题讨论】:
-
您将使用指向
IPlayer的(可能是智能的)指针容器,如std::vector<IPlayer*>或std::vector<std::unique_ptr<IPlayer>>。IPlayer类已经有一个构造函数——一个默认的;无法创建它的实例的原因是因为它是抽象的。添加更多构造函数不会改变这一事实。 -
@IgorTandetnik 对,这是最有效的选择。为什么/如何使用指针容器绕过这个问题?
-
绕过什么问题?我不确定我是否完全掌握了困难的性质。
-
如果不是 ctor,抽象类的内在特性是什么使它无法作为容器的实例?
-
你不能创建一个抽象类的实例,句号;无论是作为容器的元素还是其他。这就是纯虚函数的意义所在。你不能有
std::vector<IPlayer>,因为你不能写IPlayer player;或IPlayer* player = new IPlayer;
标签: c++ c++11 inheritance interface virtual-inheritance