我应该初始化抽象类的成员吗?

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,是的。就个人而言,我更喜欢类内初始化程序。

以上是关于我应该初始化抽象类的成员吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 抽象类

具有抽象类的 C++11 对象组合

接口和抽象类的区别

C ++为所有派生类初始化抽象基类受保护成员

Java基础进阶_2

接口和抽象类的区别(转)