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

为何通过C++基类引用无法访问派生类stDeriv的成员iD_

问题原因说明
  • 引用绑定规则限制,赋值操作不会修改引用的绑定对象
    C++中引用一旦初始化完成,就无法再重新绑定到其他对象。代码中stBase &rBase = aBase;已经把rBase永久绑定到基类对象aBase,后续执行rBase = rDeriv不是让rBase绑定到aDeriv,而是把aDeriv的值赋值给rBase绑定的aBase对象。
  • 对象切片(Object Slicing)导致派生类特有成员丢失
    执行rBase = rDeriv时,实际调用的是基类stBase的拷贝赋值运算符,该运算符只会处理基类定义的成员iB_,派生类stDeriv特有的iD_成员会被直接切掉,不会拷贝到aBase中。且aBase本身就是基类类型的对象,内存布局中没有预留存储iD_的空间,自然无法通过rBase访问到iD_。
  • 虚函数多态的前提是基类指针/引用绑定派生类对象
    虚函数的运行时多态只在基类指针/引用绑定的是派生类对象时才会触发。代码中rBase绑定的始终是基类对象aBase,aBase的虚函数表指针指向的是stBase的虚表,所以不管怎么赋值,调用rBase.Hello()始终会执行stBase的Hello实现,不会调用派生类的版本。
修正方案参考(可选)
  • 如果需要触发虚函数多态,需要让基类引用初始化时就绑定到派生类对象:
stBase &rBase = aDeriv; // 初始化时绑定派生类对象,不要绑定aBase
rBase.Hello(); // 此时会输出 Hello from stDeriv
  • 如果需要通过基类引用访问派生类特有成员,需要进行安全的向下转型:
// 转型成功说明rBase确实绑定stDeriv对象,转型失败会抛出std::bad_cast异常
stDeriv &rDerivFromBase = dynamic_cast<stDeriv&>(rBase);
cout << rDerivFromBase.iD_ << endl;

内容的提问来源于stack exchange,提问作者sylwa06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:54:03