十分钟搞定多态知识点

多态:

1.静态多态:地址早绑定,编译期间就能确定的多态;如:函数重载,运算符重载,模版

            

  2.动态多态:地址晚绑定,运行阶段确定的多态,父类指针或引用指向子类对象,在通过父类指针调用虚函数时,父类指针会通过对象里面的虚表指针找到虚表,然后在虚表中找到对象的函数的地址进行调用

函数重写(覆盖):父子类中函数返回值,名字,参数相同,且父类函数为虚函数
 

函数隐藏:父子类中函数返回值,名字,参数相同,父类函数不是虚函数

当遇到函数隐藏时该调用谁?:看调用的对象或指针是什么类型的就调用谁的函数

虚函数表里存虚函数地址

虚函数数组:存放·虚函数地址的数组

虚表

1.虚表在编译时创建,不占内存

2.每个包含虚函数的类都有虚表,虚表是存放虚函数指针的数组

3.当子类继承父类时,子类也有了自己的虚表

4.虚函数是成员函数(只有是成员函数才能成为虚函数)

5.虚表属于类,所有对象共享一个虚表

虚表指针:

1.编译器在类中添加了续表指针vptr,指向虚表,类的对象被创建出来时自动拥有续表指针vptr,

2.在构造函数中赋值

3.占内存

动态绑定:子类如果重写父类虚函数,虚函数指针就会改变为指向子类,如果没有,则继承父类

动态多态调用流程:父类指针或引用指向子类对象,在通过父类指针调用虚函数的时候,父类指针会通过对象里面的虚表指针找到虚表,然后在虚表中确定函数的地址进行调用

纯虚函数:

1.没有函数体,在虚表中存放的是0    virtual void fun()=0;

2.有纯虚函数的类是抽象类,虚函数是成员函数

3.抽象类一般用作基类

4.抽象类不能实例化对象

5.当子类继承抽象类时,必须重写父类的纯虚函数,否则子类也是抽象类

6.抽象类不能创建对象但是可以抽象类指针指向子类对象

虚析构与纯虚析构:

1.使用原因:当多态使用时,继承时编译器会把子类父类的析构处理成同名的,所以会调用父类析构,造成内存泄漏

2.解决方法:父类析构写成虚析构/纯虚析构,这样子类能释放,在子类析构的最后一行还会调用父类的析构

3.虚析构/纯虚析构就是用来解决通过父类指针释放子类对象

4.如果子类中没有堆区数据,可以不写为虚析构/纯虚析构

5.拥有纯虚析构函数的类也属于抽象类

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值