深入理解C++中虚函数的实现原理

首先来看我今天思考的找个问题,我想取到类非静态成员的地址,但是一直报错!
在这里插入图片描述

由于对类没有一个深入的理解,我查找了很多资料,发现了问题所在。类创建一个对象,他的普通成员函数,也称动态成员函数并不是属于这个对象的,而是属于类的(原谅我很菜,刚知道这一点),那么既然不属于对象,我以上写法是不合理的。但是我觉得这样写也没啥问题,毕竟 a.plays 应该是指向了这个成员函数的地址,但是c++规定了如下规则:
在这里插入图片描述
也就是说类的动态成员函数只能被对象调用。
那现在我就是想知道plays()的地址呢? 那其实我们已经知道了,plays()属于类,那么我们直接这样做:
在这里插入图片描述
这样做,不就不报错了!通过这个例子,我理解到,类的动态成员函数和对象的数据是分开的,动态成员函数是属于类的,对象的数据是属于对象的,所有对象共用类的动态成员函数,还有类的虚函数表。

然后接下来我想说一说,this指针,当我们调用类的动态成员函数对我们的对象中的成员数据进行更新的时候,他会隐式的传入一个this指针,this指针是指向对象的,所以我们通过隐式的传递this指针可以达到一个对对象数据的修改。

其实上面所说都是要让我们分清楚,类是类,对象是对象,什么东西属于类,什么东西属于对象,接下来开始我们的重点,虚函数的实现。
首先我先把一些需要知道的知识点说一下:

  1. 虚函数表属于类。
  2. 虚函数指针属于对象。
  3. 在对象被构造完成后,对象的虚函数指针指向类的虚函数表。
  4. 类的虚函数表存放的是类的虚函数指针。
  5. 类的虚函数表被存放在只读数据段。
  6. 类的成员函数存放在代码段

看下图
在这里插入图片描述
我们可以从这个图看出,类的数据和代码都是分离的。然后来阐述一下虚函数的实现,
由于虚函数是属于类的,每一个类都有一个虚函数表,,所有该类的对象公用一个虚函数表,对象有一个虚函数指针,指向虚函数表,当有继承发生时,子类会将父类的虚函数表拷贝过来,然后将将自己的虚函数加入到这个虚函数表中,如果遇到同名的函数,就覆盖他。这样就是先了多态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值