面试碰到有关非继承情况下虚函数的问题,希望老师解惑

来源: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回答

quickzhao

2020-08-11

观点点在于虚表结构的填充的顺序,建议你好好调试下虚表的结构,多试几种情况。咋们一期课程中关于C++对象模型和虚表讲得比较粗浅,打算二期在这方面会更仔细得分析一下。

0
4
嘤嘤鸣
回复
佐岸2
不太明白,p->f2是 为什么会调用B中的f1虚函数,不是一个函数啊。
2021-11-13
共4条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程