虚函数表底层剖析

虚函数表底层剖析

类的组成结构

 

虚函数表的结构

 

代码展示

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void ShowInf()
	{
		cout << "Base" << endl;
	}
	virtual void ShowName()
	{
		cout << "Name" << endl;
	}
};

using Func = void(*)(void);

int main()
{
	Base obj;
	cout << &obj << endl; // 对象的地址
	cout << (int*)&obj << endl; // 虚函数表的地址
	cout << (int*)*(int*)&obj << endl; // 访问虚函数表的第一个元素,即第一个虚函数的地址
	Func fptr = (Func)*(int*)*(int*)&obj; // 访问第一个成员函数
	Func fptr1 = (Func)*((int*)*(int*)&obj + 1); // 访问第二个成员函数
	fptr(); // 调用第一个成员函数
	fptr1(); // 调用第二个成员函数
}

 

为什么(int*)&obj与&obj解引用结果不同,但是输出的指针地址却是相同的?

(int*)&obj将指针强制类型转换为指向int类型变量的指针,我们知道int类型变量占用4个字节,因此正好该指针指向obj类对象中的虚函数表,解引用后指向虚函数表的表头元素。

而&obj解引用后,指向的是sizeof(class type)个字节,即指向整个类。

 

猜你喜欢

转载自blog.csdn.net/weixin_45590473/article/details/111659023
今日推荐