C++虚函数实现机制

今天看到一篇介绍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.随便要提一下类的静态函数可以通过普通的函数指针调用,类的非静态成员函数必须通过类的成员函数指针调用。子类的虚函数要么覆盖基类的虚函数,要么排在基类的虚函数后面。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值