关于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
相关产品推荐
相关产品推荐

