初始化基类成员的首选方法(c ++)

时间:2018-05-14 07:47:52

标签: c++ c++11 constructor

我有一个基类:

class Base {
protected:
    int m_a;
    virtual void foo() = 0;
}

派生类

class Derived : public Base {
public:
    Derived(int a);
}

基类是抽象的,因此只能创建派生类。 如何实现派生的Ctor更好的方法?

Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}

或者

Derived::Derived(int a) { m_a = a;}
Base::Base(){}

从Base构造函数中删除成员是否更好,因为它不能单独创建,或者将它保留在Base构造函数上以保留给他的赋值?

2 个答案:

答案 0 :(得分:4)

您的第一个解决方案 - 为基类提供显式构造函数 - 最好作为一般模式:

  • 它避免了从Base继承的其他类忘记初始化m_a。相反,类的签名表示需要初始化。

  • 如果多个类继承自base,并且初始化更复杂(例如范围检查),则此代码和策略不会分布在多个派生类上

  • 如果m_a是不可变的,则需要构造函数初始化

  • 派生类可能有多个CTor,更多地方要忘记

唯一的缺点:更多的打字 - 只要你不计算额外的"我今天很懒,所以不要忘记在所有派生类构造函数中初始化m_a& #34;

"签名宣布要求" IMO足以使其成为默认模式,因此#34;另一种方式需要使m_a受保护",如评论中所述。

答案 1 :(得分:1)

我更愿意:

Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}

通过这种方式,您可以使代码更加封装,并且Base成员关注其初始化列表,基类构造函数中可以有更多的init逻辑,具体取决于m_a,而不仅仅是初始化m_a。在这种情况下,您将初始值传递给基础构造函数,然后在其构造函数中派生类已初始化基类的构造函数。

您应该尝试将init值传递给Base类,假设您有5个Derived类,并且需要在所有派生的ctors中初始化基类。