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

关于C++中virtual关键字与vtable导致打印序列异常的疑问

C++虚函数调用异常原因解析
  • 核心问题是函数绑定机制的差异:C++里只有标记为virtual的成员函数才会触发动态绑定(多态),非虚函数默认是静态绑定。
  • 你的代码中f()是虚函数,所以通过基类指针ptrAtoB调用时,会根据指针实际指向的B对象,动态调用B::f(),这就是为什么结果符合预期(输出130、12)。
  • 但g()在基类A里没被声明为virtual(或者派生类B的g()没正确覆盖基类的虚版本),所以调用ptrAtoB->g()时,编译器在编译阶段就敲定了要执行A::g()——这就是静态绑定的特性,只看指针的静态类型(A*),不管实际指向的对象类型。
  • 而A::g()执行时会调用print(),因为print()是虚函数,哪怕是在基类函数里调用,依然会触发动态绑定,找到B对象的print()实现输出130,之后再执行A::g()里的代码打印5,这就对应了你看到的最后两行输出。
  • 要实现预期的调用B::g()输出131,只需在基类A中将g()声明为virtual,这样派生类B的g()会自动覆盖基类版本,此时通过基类指针调用就会触发动态绑定,执行B::g()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:32:41