我有一个基类:

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构造函数中以保留给他分配,是不是更好?

最佳答案

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

  • 可以避免从Base继承的其他类忘记初始化m_a。而是,类的签名指示需要初始化。
  • 如果多个类从基类继承,并且初始化更复杂(例如范围检查),则此代码和策略不会分布在多个派生类
  • 如果m_a是不可变的,则需要构造函数初始化
  • 派生类可能具有多个CTor,还有更多地方可以忘记

  • 唯一的缺点:多输入一些内容-只要您不计算其他额外的内容“今天我有点懒,所以请不要忘记在所有派生类构造函数中初始化m_a”

    如注释中所述,“签名宣布要求”足以使IMO成为默认模式,因此“另一种方式要求使m_a protected ”。

    07-24 09:45
    查看更多