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

标签 c++ c++11 inheritance initialization abstract-class

我想知道初始化抽象类的成员是否是最佳实践(至少有一个纯虚拟成员函数,可能是 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();
};

我应该选择哪一个,为什么?

最佳答案

严格来说,如果一个成员没有被类内初始化器、ctor-init-list初始化,在静态/线程存储类零初始化的情况下,或者在聚合值初始化或聚合初始化的情况下,它将被默认初始化,这使得像 bool 这样的类型不确定。

此后您可以分配它们,但这不是同一件事。

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

此外,您不应该不必要地重复自己的话。

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

关于c++ - 我应该初始化抽象类的成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440364/

相关文章:

c++ - 通过 bash 脚本查找和修改函数定义 (C++)

c++ - 2 deque的并集和交集(异常段错误)

c++ - 充当过滤器的范围 - 不同的迭代器集

c++ - 在 std::thread 中使用无限循环来增加和显示一个值

c - 读取内部具有不同字节长度值的二进制文件

c++ - 没有成员函数的结构的继承

c++ - 这个函数调用真的有歧义吗?

C++,捕获错误作为引用时的段错误

c++ - 正确删除 с++ 中的类

java - Java 中的引用父 UI 元素