关于vptr和vtbl
- 虚指针和虚表,一个类的对象内存占用什么样的内存?当一个类有虚函数的时候,对象里面就会多一个指针。一个虚函数和一万个虚函数是一样的。
- 继承会把成员变量继承也会把函数调用权继承下来。
一般的函数和虚函数区别。
- 虚拟表中存放的都是指针,虚函数指针。
- 编译器看见调用虚函数时,采用动态绑定。通过虚指针,查看虚表,再看调用的是哪一个函数。(普通函数调用采用动态绑定)(* p->vptr[n])(p);编译器会找到n的位置编号。
静态绑定 call XXXX
动态绑定,条件1、通过指针调用;2、指针是向上转型 up case;3、调用的是虚拟函数。(多态)
/* (1)class中有虚函数时,对象中会多一个指针,0x409004,内存会多四字节; (2)classB继承classA,classB有自己的vfunc1(),有classA的vfunc2(); (3)继承是继承的调用权,不是内存大小; (4)父类有虚函数,子类肯定有虚函数; (5)子类中函数与父类同名,但不是一个函数。 */
关于this
- 模板方法,this指针的使用场景。会把当前对象当做this指针传到方法里面。一个父类的方法A里面调用了一个虚函数,这个虚函数在子类中重载,这样当子类调用父类的方法A时,会通过父类的A函数,调用子类重载过的虚函数。
- 所有的成员函数都隐藏了一个this参数。
关于 Dynamic Binding
- 非指针调用不会产生动态绑定。
- 通过指针找到虚指针,找到虚表,找到相应的函数地址。
(1)静态绑定一定是绑定某个地址;
(2)动态绑定的三个条件:通过指针调用,指针是向上转型,调用的是虚函数。