多态实现原理

本文详细探讨了C++中实现多态性的三种不同版本的方法,重点讲解了虚函数表(vtable)的概念及其工作原理。通过具体实例说明了如何通过虚指针指向虚函数表来实现动态绑定,进而解释了基类指针调用派生类虚函数的过程。

前提:存在多态性(虚函数)

版本1

1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

2、每个类产生一个对象时,都会产生一个虚指针,该指针指向对应类的虚表

3、当基类指针指向派生类对象,调用相关操作时:

  基类指针首先指向派生类对象虚指针(派生类对象虚指针当然是指向派生类对象虚表了),通过该指针遍历虚表,

    若匹配,则执行该操作(即派生类函数),若无(不匹配,相关操作对应的函数为非虚函数,虚表本来就是存放虚函数地址的),

                     则基类指针就指向派生类的普通函数地址直接遍历,执行操作,

                     若还未找到就去基类的普通函数地址中找,执行操作。

版本2

1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

2、每个类也会维持一个虚指针(我想应该是静态的),该指针指向对应类的虚表

3、当基类指针指向派生类对象,调用相关操作时:

  基类指针首先指向派生类对象虚指针(派生类对象虚指针当然是指向派生类对象虚表了),通过该指针遍历虚表,

    若匹配,则执行该操作(即派生类函数),则基类指针就指向派生类的普通函数地址直接遍历,执行操作,

 

                     若还未找到就去基类的普通函数地址中找,执行操作。

版本3

1、每个类都会维持一份虚表(该表存的是虚函数的入口地址)

2、每个类产生一个对象时,都会产生一个虚指针,但是,该指针是动态绑定的,可以指向基类也可以是派生类

3、当基类指针指向派生类对象,调用相关操作时:

  基类指针指向该虚指针,而该指针首先指向派生类虚表,通过该指针遍历虚表,

    若匹配,则执行该操作(即派生类函数),若无(不匹配,相关操作对应的函数为非虚函数,虚表本来就是存放虚函数地址的),

                     则该指针就指向派生类的普通函数地址直接遍历,执行操作,

                     若还未找到就去基类的普通函数地址中找,执行操作。

 

 

注意:

  1、虚指针是属于类的还是伴随着对象的产生而产生?

  2、sizeof(classname)字节要多4字节(貌似是虚指针),这样虚指针是属于类的,若属于类,则应该是静态的,而静态的是不占类字节大小的,何解?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值