虚函数与多态

虚函数与多态

1. 定义

虚函数的作用是为了实现多态的机制。

多态:用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这样可以实现“多种形态”,这是一种泛型技术。

2. 虚函数表

每个含有虚函数的类都有一个虚函数表(Virtual Table),C++编译器应该保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能—–如果有多重继承情况)。这就意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应函数。

  1. 每一个类都有一个虚函数表;
  2. 虚表可以继承,即使子类没有重写虚函数,子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类有三个虚函数,那么基类的虚表中就会有三项(虚函数地址),派生类也会有虚表,至少有三项。如果重写了其中的虚函数,那么虚表中的地址就会改变,指向自身实现的虚函数实现。如果派生类就自己新实现的虚函数,那么就在虚表中添加一项。
  3. 派生类的虚表中虚函数地址排列顺序和基类的虚表中虚函数地址排列顺序是一样的,子类独有的虚函数则放在后面。

当定义一个有虚函数的类的对象时,对象的第一块内存空间就是一个指向虚表的指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值