C++之虚函数原理

C++的对象存储包括数据部分,如虚函数指针和虚基类指针。虚函数通过虚函数表(vtbl)实现,每个类有一个虚函数表,对象包含一个vptr指向对应的vtbl。派生类会继承基类的虚函数表,并在需要时添加或替换虚函数地址。
摘要由CSDN通过智能技术生成

对象数据和函数的存储方式

注意说的是对象

C++中的对象存储方式是

 每个对象占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数属于公共部分。

 虚函数表

虚函数是通过虚函数表实现的。

C++实现虚函数的方法是:为每个类对象添加一个隐藏成员,隐藏成员保存了一个指针,这个指针叫虚表指针(vptr),它指向一个虚函数表(virtual function table, vtbl)

虚函数表存放的是一个虚函数的地址(可以理解为数组里存放着指向每个虚函数的指针)

即:每个使用一个虚函数表,每个类对象用一个虚表指针

基类对象包含一个虚表指针,指向基类的虚函数表
派生类对象也将包含一个虚表指针,指向派生类虚函数表

  • 如果派生类重写了基类的虚方法,该派生类虚函数表将保存重写的虚函数的地址,而不是基类的虚函数地址
  • 如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法,而且派生类中虚函数表将保存基类中未被重写的虚函数的地址,但如果派生类中定义了新的虚方法,则该虚函数的地址也将被添加到派生类虚函数表中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值