C++派生类构造调用基类构造时无法更新基类成员值问题
问题原因
你在random类的带参构造函数中写的Cylinder(r,h);并没有初始化当前对象的基类部分,而是在构造函数体内创建了一个独立的临时Cylinder匿名对象,整个执行流程和输出完全对应:
- 进入
random带参构造函数前,由于你没有在初始化列表中指定基类的构造方式,编译器会自动调用Cylinder的无参默认构造,将当前对象的r、h赋值为2.0,对应输出中第一行的第一个Constructor Invoked!。 - 执行构造函数体时,
Cylinder(r,h);会生成一个临时的栈上Cylinder对象,用传入的10.0初始化r和h,对应输出中第一行的第二个Constructor Invoked!。 - 这行代码执行结束后,临时
Cylinder对象立刻被销毁,对应输出中的第一个Destructor Invoked!,这个临时对象的成员修改完全不会影响当前random实例的基类成员。 - 后续调用
disp_cy()打印的是当前实例的基类成员,也就是默认构造设置的2.0,等main函数执行结束R1对象销毁时,会再打印一次Destructor Invoked!,和你给出的运行结果完全一致。
修复方案
C++中派生类调用基类构造函数,必须写在派生类构造函数的初始化列表中,不能写在构造函数体内部。将random类的带参构造修改为如下形式即可:
random(double r,double h) : Cylinder(r, h) // 初始化列表中显式调用基类带参构造 { // 移除函数体内原来的Cylinder(r,h);语句 }
修复后运行的预期输出为:
Constructor Invoked! Radius:10 Height:10 Destructor Invoked!
内容的提问来源于stack exchange,提问作者athulkrishnakr
相关产品推荐
相关产品推荐

