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

C++派生类指针指向基类对象调用成员函数的运行结果疑问

运行结果底层逻辑解释

1. 核心问题出在不安全的C风格强制类型转换

你代码中((C*)p)->Print(9)的写法属于未定义行为:p实际指向的是B类实例,C风格的指针强制转换不会做任何运行时类型校验,直接强制编译器将该地址当作C类对象的指针处理,这个转换本身就是非法的,不存在“B类对象包含C类代码”的情况。

2. 非虚函数是静态绑定的

Print(int n)成员函数没有被声明为virtual,这类非虚函数的调用地址是编译期就确定的静态绑定:

  • 编译器看到你用C*类型的指针调用Print(int),就会直接绑定到C::Print(int)的实现,根本不会管指针实际指向的是啥类型的对象,所以才会输出C - 9。
  • 与之对比的是你之前调用的无参Print()是虚函数,走运行时动态绑定,会根据指针实际指向的对象类型(B类)调用对应实现,所以前两行输出符合你的预期。

3. 注意事项

这种非法强制转换能跑出结果属于巧合,是因为当前三个类的内存布局相近、没有额外自定义成员变量。如果C类包含独有的成员变量、虚函数,这种调用大概率会触发内存访问错误、程序崩溃等更严重的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:03