您的位置:首页 > 编程语言 > C语言/C++

C++虚函数实现机制

2015-03-22 19:37 253 查看
今天看到一篇介绍C++虚函数实现机制写得非常好的一篇博文,下面给出链接:

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.随便要提一下类的静态函数可以通过普通的函数指针调用,类的非静态成员函数必须通过类的成员函数指针调用。子类的虚函数要么覆盖基类的虚函数,要么排在基类的虚函数后面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: