面试碰到有关非继承情况下虚函数的问题,希望老师解惑
来源:8-18 Hack对象模型和虚函数
12345ayu
2020-08-11
#include <iostream>
using namespace std;
class A {
public:
void f1() {
printf("A::f1");
}
virtual void f2() {
printf("A::f2");
}
};
class B {
public:
virtual void f1() {
printf("B::f1");
}
virtual void f2() {
printf("B::f2");
}
};
int main() {
B object;
A* p = (A*)&object;
p->f1();
p->f2();
return 0;
}
老师您好,面试的时候碰到这样的问题,以前碰到的都是继承情况下的虚函数用法,这种非继承情况下的虚函数用法没遇见过,我的理解是
1.非虚函数不使用虚函数表,调用位置是固定的,所以p->f1();输出"A::f1"
2.面试时候,我猜的是,A* p = (A*)&object;这个操作应该类似于A类继承了B类,而A类重写了虚函数f2,所以输出是"A::f2"
当时面试官说,你没有理解C++的真谛和精髓
后来我又想了想,感觉这应该是一种未定义行为,毕竟虚函数在设计上就是保证派生类能调用重写方法,这样的话输出可以会根据环境的不同而变化
面试完,我运行了一下发现输出是"A::f1"“B::f1”,试了下不同的环境都是这样的输出,不清楚为什么p->f2()输出的是"B::f1",希望老师解惑,谢谢
写回答
1回答
-
观点点在于虚表结构的填充的顺序,建议你好好调试下虚表的结构,多试几种情况。咋们一期课程中关于C++对象模型和虚表讲得比较粗浅,打算二期在这方面会更仔细得分析一下。
042021-11-13
相似问题