虚表~

虚表(vtable)一直都好像很神秘的样子,今天工作中涉及到虚表,就做下一些记录吧~

1.每一个拥有虚函数的类都有一个虚表,注意是虚函数。

2.虚表实际上是一个函数指针数组,记录了本类所有虚函数的地址。当类对象调用虚函数时,会根据对应关系从虚表中获得虚函数指针,再去执行函数,这种行为称为晚绑定。

3.子类的虚表继承了父类的虚表,如果父类vtable中包含某一项,则子类的vtable中也将包含同一项,但两项的值可能不同;如果子类重写了虚函数,则派生类的vtable的该项指向重写后的虚函数,否则沿用父类的值。

4.每一个类只有唯一的一个vtable,并非每个类的对象都有一个vtable,但每个类的对象都有一个指针指向vtable。

5.在类对象的内存布局中,首先是该类的vtable指针,然后才是对象数据。

一些疑问:

问:没有虚函数的类的对象也会有指向虚表的指针吗?。

答:没有虚函数的类都没有虚表,大哥。

问:怎么通过虚表理解多态?

答:当类对象调用虚函数时,是通过该对象的指向虚表的指针来获得虚函数进而调用函数。注意上一句话的该对象,所以说基类的指针指向的是基类的对象时,就会通过基类的对象的虚指针来获得基类虚函数地址,当基类的指针指向子类对象的时候就会通过子类对象的虚指针获得子类的虚函数地址调用函数。就这样。

问:普通成员函数的地址又是存放在哪?函数的定义呢?

答:在编译器编译时在将函数放在内存的代码段中。

问:虚表是在什么时候被创建?

答:编译器在编译的时候,发现类中有虚函数,则为该类创建一个虚表;而指向虚表的虚指针是在构造函数中被创建。

虚函数表(Virtual Function Table)是一张存储了虚函数地址的表格。每个包含虚函数的类都会有一张对应的虚函数表。该表的每一项都是一个虚函数的地址。这个表是属于类的,而不是属于某个具体的对象,因此一个类只需要一张虚函数表。 虚函数指针(Virtual Function Pointer),也称为vfptr,是指向虚函数表的指针。在一个对象的内存布局中,虚函数指针位于最前端。通过虚函数指针,对象可以在运行时动态地调用正确的虚函数。 具体来说,虚函数指针指向了对象所属类的虚函数表的首地址。通过这个虚函数指针,对象可以访问到自己所属类的虚函数表。而虚函数表中的每一项都是一个虚函数的地址,通过这个地址,对象可以调用对应的虚函数。 总结起来,虚函数表是一张存储了虚函数地址的表格,属于类而不是对象。虚函数指针是指向虚函数表的指针,位于对象的内存布局的最前端。通过虚函数指针,对象可以在运行时动态地调用正确的虚函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [虚函数表及虚函数表指针(看似简单,深入部分也不是很懂)](https://blog.csdn.net/fengdijiang/article/details/106737667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [虚函数指针和虚函数表](https://blog.csdn.net/hrbust_cxl/article/details/117393978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值