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

C++继承场景下基类引用调用getName为何输出Data而非DerivedData

C++同名非虚成员函数调用问题解释

核心原因

该现象由C++的静态绑定规则和非虚函数的调用逻辑决定,具体原因如下:

  • 基类Data的getName()成员函数未被声明为virtual,因此派生类DerivedData的同名getName()并未实现基类函数的重写,仅仅是隐藏了基类的同名函数。
  • 测试代码中rd的静态类型为Data&,即使它实际绑定的是派生类DerivedData的对象dd,对于非虚成员函数,编译器会在编译阶段就根据变量的静态类型确定调用的函数版本,不会在运行期根据实际指向的对象类型做动态分发,因此调用的是基类Data的getName(),输出Data。

扩展说明

如果想要实现根据实际对象类型调用对应版本的getName()(即动态绑定),仅需修改基类getName()的声明,添加virtual关键字即可:

// 修改后的基类getName声明
virtual std::string getName() const { 
    return "Data"; 
}

C++11及更高版本中,还可以在派生类的getName()声明后添加override关键字,校验该函数是否正确重写了基类的虚函数,避免拼写、参数不匹配等低级错误。

另外测试代码中的Data d = dd;属于对象切割操作,会把dd里的派生类特有部分全部丢弃,仅保留基类子对象赋值给d,如果调用d.getName(),无论是否是虚函数,都会调用基类版本。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:00