【C++】-多态的底层原理

> 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!


前言

今天我们开始讲解多态的底层原理,相信这篇博客会让你对多态的理解会更加的透彻,话不多说我们开始进入讲解


一、虚函数表

我们在多态语法的时候一直强调要构成虚函数,我们来看看虚函数在内存是怎么存储的?

// 这里常考一道笔试题:sizeof(Base)是多少?
class Base
{
   
public:
	 virtual void Func1()
	 {
   
	 	cout << "Func1()" << endl;
	 }
private:
 int _b = 1;
};

在这里插入图片描述
我们发现我们对象里面存放两个内容:成员变量和一个指针地址,刚好大小就是8。====

通过观察测试我们发现b对象是8bytes,除了_b成员,还多一个__vfptr放在对象的前面(注意有些平台可能会放到对象的最后面,这个跟平台有关),对象中的这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表,。那么派生类中这个表放了些什么呢?我们接着往下分析


我们往这这个Base里面增加先的内容:

class Base
{
   
public:
	virtual void Func1()
	{
   
		cout << "Base::Func1()" << endl;
	}
	virtual void Func2()
	{
   
		cout << "Base::Func2()" << endl;
	}
	void Func3()
	{
   
		cout << "Base::Func3()" << endl;
	}
private:
	int _b = 1;
};
class Derive : public Base
{
   
public:
	virtual void Func1()
	{
   
			cout << "Derive::Func1()" << endl;
	}
private
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘柚!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值