C++调用派生类构造函数是否创建基类对象及相关语法问题
C++派生类构造相关问题解答
首先明确核心问题:调用派生类构造函数时,一定会创建对应的基类子对象,它是派生类对象内存布局的一部分,不属于独立的基类对象。
示例测试代码如下:
#include<iostream> using namespace std; class Base{ private: int x; public: Base(int i){ x = i; } void print(){ cout<<x<<endl; } }; class Derived: public Base{ public: Base b; public: //派生类构造函数,同时初始化基类子对象和成员b Derived(int i, int j): Base(i), b(j) {} }; int main(){ Derived d(11, 22); d.print(); d.b.print(); return 0; }
问题1:为什么继承得到的基类子对象的x值为11,而派生类的Base类型成员b的x值为22?
- 你在派生类的构造函数初始化列表中做了两个独立的初始化操作:
Base(i):负责给派生类继承得到的内置基类子对象初始化,传入的参数是第一个入参i=11,所以这个子对象的x被赋值为11,调用d.print()时输出的就是这个子对象的x值。b(j):负责给派生类自己声明的Base类型成员变量b初始化,传入的参数是第二个入参j=22,所以成员b的x被赋值为22,调用d.b.print()时输出的就是这个成员的x值。
- 上述两个Base类实例互相独立,存储的x值互不干扰,所以结果不同。
问题2:如果基类构造函数对Base类中的int类型成员x完成了初始化,是否意味着存在对应的Base对象?
- 是的。C++对象构造规则明确,只有对应类的实例存在时,才会调用它的构造函数完成成员初始化。只要Base的构造函数正常执行完成,就说明对应的Base实例已经存在,这个实例可能是独立创建的Base对象,可能是派生类里的基类子对象,也可能是其他类里的Base类型成员变量。
问题3:当派生类中存在Base类型的成员变量b时,派生类构造函数的参数列表应当设置1个参数还是2个参数?
- 没有强制规定,完全取决于实际使用需求:
- 如果你需要外部灵活传入两个值,分别给基类子对象和成员b做初始化,就设置2个参数,和示例代码的写法一致即可。
- 如果其中一个值可以固定写死,比如基类子对象固定传0,只需要外部传入成员b的初始化值,就可以只设1个参数,写法参考:
Derived(int j): Base(0), b(j) {}。 - 如果你两个初始化值都可以固定写死,派生类构造函数甚至可以不需要设置参数。
内容的提问来源于stack exchange,提问作者pipi
相关产品推荐
相关产品推荐

