(1)虚指针与虚表
通过对上图左侧三个内存数据块的分析可以看出:子类对象继承了父类的成员数据。并且父类有虚函数,子类一定有虚函数。不仅数据会被继承,函数也会被继承。但是应当注意的是此时子类继承的是函数的调用权,而不是调用函数的空间。
当类中存在虚函数,此时就存在动态绑定机制。在动态绑定中,借助于虚指针vptr与虚表vtbl完成函数的查找。首先找到vptr,然后找到vtbl,进而找到相对应的函数。动态绑定也被称之为虚机制。
动态绑定(虚机制)的三个条件:
<1>通过指针调用;
<2>指针是向上转型;
<3>调用的是虚函数。
(2)this指针
利用对象调用,对象的地址就是this pointer。所有的成员函数都有一个隐藏的this pointer。在上图中重点应当理解灰色调用线路。
(3)动态绑定与静态绑定
B b;
A a = (A)b; // B类继承与A类
a.vfun1();
在上述代码中,a.vfun1();并解析为汇编语言为call XXXX的形式属于静态绑定。
A* pa = new B;
pa->vfunc1();
pa = &b;
pa->vfunc1();
上述代码中函数调用属于动态绑定。动态绑定(虚机制)的三个条件:<1>通过指针调用;<2>指针是向上转型;<3>调用的是虚函数。
(4)const
对const,应当注意:当成员函数的const和non-const版本同时存在时,const object只会(只能)调用const版本,而non-const object只会(只能)调用non-const版本。
(5)new与delete
对于new与delete,此处给出了本周的编程作业: