我有一个基类:
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构造函数上以保留给他的赋值?
答案 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中初始化基类。