#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",希望老师解惑,谢谢