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

