虚函数实现机制

虚函数实现机制:

1、当类中存在虚函数里.则编译器会在编译期自动的给该类生成一个函数表,并在所有该类的对像中放入一个隐式变量vptr,该变量是一个指针变量,它的值指向那个类中的由编译器生成的虚函数表.

2、每个类自己的虚函数入口都在这张表中维护,调用方法的时候会隐式的传入一个this指针,然后系统会根据this指针找到对应的vptr,进而找到对应的虚函数表,找到真正方法的地址,然后才去调用这个方法,这可以叫动态绑定。

3、虚函数表存放重写的虚函数,当基类的指针指向派生类的对象时,调用虚函数时都会根据vptr来选择虚函数,而基类的虚函数在派生类里已经被改写或者说已经不存在了,所以也就只能调用派生类的虚函数版本了.


当调用pBase->show();时,执行的步骤:

1,  判断Base类中show是否为虚函数。

2,  若不是虚函数则找到pBase所指向的对象所属类Base。执行Base::show()。若是虚函数则执行步骤3.

3,  访问pBase所指对象的虚函数表指针得到pBase所指对象所在类的虚函数表。

4,  查找Base中show()在声明时的位序为x,到步骤3得到的虚函数表中找到位序x,从而得到要执行的show的函数地址。

5,  根据函数地址和Base中声明的show的函数类型(形参和返回值)访问地址所指向的函数。


从虚函数的实现机制可以看到要想在子类中实现多态需要满足三个重要的条件。

(1)在基类中函数声明为虚函数。

(2)在子类中,对基类的虚函数进行了重写。

(3)基类的指针指向了子类的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一个博客,这个博客记录了他读这本书的笔记,总结得不错。《深度探索C++对象模型》笔记汇总 1. C++对象模型与内...
    Mr希灵阅读 5,652评论 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,540评论 1 51
  • C++ 面向对象编程 博客园地址:http://www.cnblogs.com/xiongxuanwen/p/42...
    先之阅读 687评论 0 1
  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 1,755评论 4 19
  • 今天去找领导签字,各种不顺,以前的我可能会各种不舒服、纠结,怕自己给领导留下坏印象,对我发展不顺利;可今天的我竟然...
    北极熊和小兔子阅读 490评论 0 48