45、子类需要重写父类的构造函数嘛,子类自己的构造函数呢?
45、子类需要重写父类的构造函数嘛,子类自己的构造函数呢?
一、子类是否需要重写父类的构造函数?
1. 不需要重写的场景
-
基类有无参构造函数
若父类(基类)显式或隐式定义了无参构造函数,子类无需重写构造函数即可直接实例化。例如:class Base { public:Base() {} // 无参构造函数 }; class Derived : public Base {}; // 子类无需定义构造函数
-
使用继承构造函数(C++特性)
在C++11中,通过using Base::Base
语法可直接继承父类的所有构造函数,无需手动重写:class Base { public:Base(int);Base(int, double); }; class Derived : public Base { public:using Base::Base; // 继承Base(int)和Base(int, double) };
2. 必须重写的场景
-
基类没有无参构造函数
若父类未定义无参构造函数且子类未使用继承构造函数,子类必须显式调用父类的有参构造函数:class Base { public:Base(int x) {} // 仅定义有参构造函数 }; class Derived : public Base { public:Derived(int x) : Base(x) {} // 必须显式调用父类构造函数 };
-
需要初始化子类新增成员
若子类新增了需要初始化的成员变量,即使继承构造函数,仍需手动定义构造函数。
二、子类重写父类构造函数后 是否需要单独定义自己的构造函数?
子类是否需要定义自己的构造函数,与其是否“重写”父类构造函数并无直接关联。具体是否需要定义子类构造函数,分以下两种情况:
- 子类必须定义构造函数的场景
- 父类没有 无参构造函数,且子类未通过继承或其他方式复用父类构造函数。
- 子类需要初始化自身 新增的成员变量或资源。
- 需要定制化构造逻辑(如参数校验、动态资源分配)。
- 无需定义构造函数的场景
- 父类有无参构造函数,且子类无新增初始化需求。
- 子类通过继承语法(如C++的
using Base::Base
)直接复用父类构造函数。
核心:父类负责自身成员的初始化,子类负责新增成员的初始化。若子类未显式调用父类构造函数,可能导致父类成员未初始化。