http://blog.sina.com.cn/s/blog_54f82cc201013qii.html
看完之后,对C++中的虚函数实现机制算的上是恍然大悟,但是个人感觉博文中有几点不足之处,现在一一列举,以下语言仅仅代表个人看法:
1.定位虚表的方式:
大家都知道含有虚函数的类的实例里面前4个字节是虚函数指针占用的内存,里面填充的是虚函数表的地址号。原博文中通过一个long类型的对象取得前四个字节的内容,再进行一系列强制转换。个人觉得可以用如下方式改进:
Test object; //Test类中含有虚函数
int *VPtr; //定义int类型的指针指向虚表
memcpy(&VPtr,&object,4); //VPtr的地址里面保持续表的地址号
2.取出虚表里面的函数地址的方式:
原博文中的强制转换且不说安全性问题,就我而言,我完全没有看懂。个人觉得按照如下方式改进,理解起来或许更加容易:
void (Test::*VFPtr)(); //定义类的成员函数指针
memcpy(&VFPtr,VPtr,4); //将VPtr指向的内存(就是虚表占用的内存)里面的前4个字节(就是第一个虚函数的地址)拷贝到VFPtr占用的内存里面
3.调用虚函数的方式
原博文中通过传递一个类的指针来调用虚函数,但是我仔细试过,这样根本不能在虚函数里面调用该指针所指向对象的成员变量,究其原因大概是没能将该指针赋值给this指针吧(我试过用这种方式,在虚函数里面输出this指针的值),后面查阅了一些资料,想到了用类的成员函数指针,毕竟成员函数指针要通过类的对象来引用。这样一来就可以在虚函数中访问该对象的成员变量了。后面发现果然可以。
(object.*VFPtr)(); //调用object对象里面的第一个虚函数
4.随便要提一下类的静态函数可以通过普通的函数指针调用,类的非静态成员函数必须通过类的成员函数指针调用。子类的虚函数要么覆盖基类的虚函数,要么排在基类的虚函数后面。