首先来看我今天思考的找个问题,我想取到类非静态成员的地址,但是一直报错!
由于对类没有一个深入的理解,我查找了很多资料,发现了问题所在 。类创建一个对象,他的普通成员函数,也称动态成员函数并不是属于这个对象的,而是属于类的(原谅我很菜,刚知道这一点),那么既然不属于对象,我以上写法是不合理的 。但是我觉得这样写也没啥问题,毕竟 a.plays 应该是指向了这个成员函数的地址,但是c++规定了如下规则:
也就是说类的动态成员函数只能被对象调用 。
那现在我就是想知道plays()的地址呢? 那其实我们已经知道了,plays()属于类,那么我们直接这样做:
这样做,不就不报错了!通过这个例子,我理解到,类的动态成员函数和对象的数据是分开的,动态成员函数是属于类的,对象的数据是属于对象的,所有对象共用类的动态成员函数,还有类的虚函数表 。
然后接下来我想说一说,this指针,当我们调用类的动态成员函数对我们的对象中的成员数据进行更新的时候,他会隐式的传入一个this指针,this指针是指向对象的,所以我们通过隐式的传递this指针可以达到一个对对象数据的修改 。
其实上面所说都是要让我们分清楚,类是类,对象是对象,什么东西属于类,什么东西属于对象,接下来开始我们的重点,虚函数的实现 。
首先我先把一些需要知道的知识点说一下:
- 虚函数表属于类 。
- 虚函数指针属于对象 。
- 在对象被构造完成后,对象的虚函数指针指向类的虚函数表 。
- 类的虚函数表存放的是类的虚函数指针 。
- 类的虚函数表被存放在只读数据段 。
- 类的成员函数存放在代码段
我们可以从这个图看出,类的数据和代码都是分离的 。然后来阐述一下虚函数的实现,
由于虚函数是属于类的,每一个类都有一个虚函数表,,所有该类的对象公用一个虚函数表,对象有一个虚函数指针,指向虚函数表,当有继承发生时,子类会将父类的虚函数表拷贝过来,然后将将自己的虚函数加入到这个虚函数表中,如果遇到同名的函数,就覆盖他 。这样就是先了多态 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
