You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:27:25