C++多态调用实现原理(虚函数表详解)

1.带有虚函数的基类对象模型

我们先看段代码:

#include<iostream>
using namespace std;
class B1
{
   
   
	public:
		void func1()
		{
   
   }
		int _b;
};
class B2
{
   
   
	public:
		virtual void func()
		{
   
   }
		int _b;
};
int main()
{
   
   
	cout<<"sizeof(B1) = "<<sizeof(B1)<<endl;  
	cout<<"sizeof(B2) = "<<sizeof(B2)<<endl;
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
可以看出,B2的这个类比B1多了4个字节,而这4个字节就是用来存放虚函数的地址,也就是说,这4个字节的数据是一个指针(地址),这个指针指向的是虚函数地址。看个图就很容易理解。
在这里插入图片描述
我们需要注意的是:
1.B2对象的前4个字节存放的是虚表的地址,其后才是B2该对象的成员变量;(虚函数表我们也叫做虚表)。
2.若B2这个类中有多个虚函数,那么其对象大小还是8,因为前4个字节是存放虚函数表的地址,在这个虚函数表(函数指针数组)里面每个元素才是每个虚函数的地址。

2.派生类对象虚函数表如何构建?

上个例子,只是给出了带有虚函数基类的对象模型,那派生类的对象虚函数表应该如何构建?

#include<iostream>
#include<string>
using namespace std;
class Base					//基类
{
   
   
public:
	virtual void TestFunc1()
	{
   
   
		cout << "Base::TestFunc1()" << endl;
	}
	virtual void TestFunc2()
	{
   
   
		cout << "Base::TestFunc2()" << endl;
	}
	virtual void TestFunc3()
	{
   
   
		cout << "Base::TestFunc3()" << endl;
	}
	int _b;
};
class Derived : public Base					//派生类
{
   
   
public:
	virtual void TestFunc4()
	{
   
   
		cout << "Derived::TestFunc4()" << endl;
	}
	virtual void TestFunc1()
	{
   
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值