【C++】虚表指针和虚函数表

一、虚表指针和虚函数表定义

  • 虚表指针:指向虚函数表首地址的一个指针,存在于每个基类对象的内存中,在调用构造函数构造对象时,设置虚表指针__vfptr
  • 虚函数表:在编译阶段生成,编译器将类中虚函数的地址存放在虚函数表中,虚函数表存在于全局数据区.data,每个类仅有一个,供所有对象共享。

二、虚函数表生成

我们已经清楚虚函数表是在编译期间生成的,那我们详细看看虚函数表的生成过程吧,以下面代码为例

class A
{
private:
	int val;
public:
	A(int x = 0): val(x){ cout << "A()" << endl; }
	virtual ~A(){ cout << "~A()" << endl; }
	virtual void fun1(){ cout << "A::fun1()" << endl; }
	virtual void fun2(){ cout << "A::fun2()" << endl; }
};
class B : public A
{
private:
	int num;
public:
	B(int x = 0): num(x), A(x){ cout << "B()" << endl; }
	virtual ~B(){ cout << "~B()" << endl; }
	virtual void fun1(){ cout << "B::fun1()" << endl; }
	virtual void fun2(){ cout << "B::fun2()" << endl; }
}

😏生成的虚函数表的过程:
在这里插入图片描述


三、虚表指针的内存模型

以上面代码为例:生成B b(10);对象的内存模型
在这里插入图片描述


四、虚表指针的设置过程

设置时机:
运行阶段调用类的构造函数时、调用析构函数(定义成虚函数)时

1. 构造过程

(1)调用A(10)构造函数并设置__vfptr
在这里插入图片描述

(2)构造b(10)并设置__vfptr过程

在这里插入图片描述

2. 析构过程

(1)先析构派生类对象b(10)
在这里插入图片描述
(2)析构基类对象过程
在这里插入图片描述


  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值