我应该初始化抽象类的成员吗?
Posted
技术标签:
【中文标题】我应该初始化抽象类的成员吗?【英文标题】:Should I initialize members of an abstract class? 【发布时间】:2019-06-04 08:45:33 【问题描述】:我想知道初始化抽象类的成员是否是最佳实践(至少有一个纯虚拟成员函数,可能是 dtor)。另一种选择是在继承类中进行。
在继承类中初始化
class IPlayer
public:
virtual ~IPlayer() ;
protected:
bool m_alive;
;
class Bomber : protected IPlayer
public:
Bomb(bool t_alive = true)
m_alive = t_alive;
~Bomb();
;
在父类、抽象类中初始化
class IPlayer
public:
virtual ~IPlayer() ;
protected:
bool m_alive true ;
;
class Bomber : protected IPlayer
public:
Bomb();
~Bomb();
;
我应该更喜欢哪一个,为什么?
【问题讨论】:
为IPlayer
提供一个protected
构造函数,它将执行正确的初始化,并最终隐藏m_alive
。
一般来说,没有关键的区别。如果您在父类中实例化它,则将其视为类的默认初始化。顺便说一句,您不应该在受保护模式下继承 IPlayer
,因为这样您就无法通过标准方式对其进行转换。
【参考方案1】:
严格来说,如果一个成员没有被in-class-initializer,ctor-init-list初始化,在静态/线程存储类零初始化的情况下,或者在聚合值初始化或聚合初始化的情况下,它将被默认初始化,从而使 bool
等类型不确定。
您可以之后分配它们,但这不是一回事。
现在我们进入下一部分:
每个类都应尽可能合理地执行其自己的不变量。是的,拥有非private
成员会降低这种能力,但可以转化为更少的副本从而潜在地提高效率的便利有时是值得的。
另外,你不应该不必要地重复自己。
所以,使用类内初始化器。
【讨论】:
IPlayer::IPlayer() : m_alive(true)
@Bart 那将使用ctor-init-list,是的。就个人而言,我更喜欢类内初始化程序。以上是关于我应该初始化抽象类的成员吗?的主要内容,如果未能解决你的问题,请参考以下文章