Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该初始化抽象类的成员吗?_C++_C++11_Inheritance_Initialization_Abstract Class - Fatal编程技术网

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

C++ 我应该初始化抽象类的成员吗?,c++,c++11,inheritance,initialization,abstract-class,C++,C++11,Inheritance,Initialization,Abstract Class,我想知道初始化抽象类(至少有一个纯虚拟成员函数,可能是dtor)的成员是否是最佳实践。另一种选择是在继承类中执行 在继承类中初始化 在父抽象类中初始化 我应该选择哪一个,为什么?严格地说,如果一个成员不是由类内初始值设定项ctor init list初始化的,在静态/线程存储类零初始化的情况下,或者在聚合值初始化或聚合初始化的情况下,它将默认初始化,这使得像bool这样的类型不确定 之后可以分配它们,但这不是一回事 现在我们进入下一部分: 每个类都应该尽可能地执行自己的不变量。是的,拥有非私有成

我想知道初始化抽象类(至少有一个纯虚拟成员函数,可能是dtor)的成员是否是最佳实践。另一种选择是在继承类中执行

在继承类中初始化 在父抽象类中初始化
我应该选择哪一个,为什么?

严格地说,如果一个成员不是由类内初始值设定项ctor init list初始化的,在静态/线程存储类零初始化的情况下,或者在聚合值初始化或聚合初始化的情况下,它将默认初始化,这使得像
bool
这样的类型不确定

之后可以分配它们,但这不是一回事

现在我们进入下一部分:
每个类都应该尽可能地执行自己的不变量。是的,拥有非私有成员会降低这种能力,但这种便利性有时是值得的,因为它可以转化为更少的副本,从而潜在地提高效率

此外,你不应该不必要地重复你自己


因此,请使用类内初始值设定项。

IPlayer
提供一个
protected
构造函数,该构造函数将执行正确的初始化,并最终隐藏
m_alive
。一般来说,没有重要的区别。若您在父类中实例化它,那个么可以将其视为类的默认初始化。顺便说一句,您不应该在保护模式下继承
IPlayer
,因为这样您就无法通过标准方式对其进行强制转换。
IPlayer::IPlayer():m_alive(true){}
@Bart将使用ctor init列表,是的。就个人而言,我更喜欢类内初始值设定项。
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();
};