C++之多态

一、多态的基本概念

        多态分为静态多态和动态多态

        前置例如函数重载和运算符重载,后者例如派生,虚函数运行时多态

区分点 

        前者函数地址编译阶段绑定,早。

        后者函数地址运行阶段绑定,晚。

动态多态满足条件

        1.有继承关系

        2.子类要重写父类重的虚函数virtual (函数类型)(函数名){};

        (重写意味着 函数返回值类型 函数名 参数列表 完全相同)

动态多态的使用

        父类的指针或引用 指向子类对象

        当写虚函数后,类的内部发生改变,多了一个虚函数指针vfpt,它指向一个虚函数表vftable,虚函数表内部记录了虚函数的函数入口地址,当子类重写虚函数,他会把父类继承过来的虚函数表记录内容改掉,替换成子类函数入口。当你用父类引用指向子类对象时,由于你本身依然是子类对象,所以当你调用公共接口它会从子类中找到重写后的函数接口

二、多态实际应用一

        分别应用算法和多态技术实现两个操作数进行运算的计算器类

                父类只提供操作数和端口

                子类辅助加减乘除

        开闭原则:

                        对扩展进行开放,对修改进项关闭

        多态优点:

                >代码组织结构清晰

                >可读性强

                >利于前期后期的拓展与维护

三、纯虚函数和抽象类

        因为再多态中,通常父类中的虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将函数改为纯虚函数

        语纯虚函数法     

                virtval 返回值类型 函数名 (参数列表)= 0;

        当类中有了纯虚函数,这个类也称为抽象类

        抽象类特点:

                >无法实例化对象

                >子类必须重写抽象类中的虚函数,否则也属于抽象类

四、多态实际应用二

        利用多态技术是实现本案例,提供抽象制品饮品父类,提供子类制作咖啡和茶叶

五、虚析构和纯虚析构

        解决多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码,方法是将父类中的析构函数改为虚析构或者纯虚析构

        虚析构和纯虚析构的共性:

                >可以解决父类指针释放子类对象

                >都需要有具体的函数实现

     虚析构和纯虚析构的区别:

                >如果是纯虚析构,该类属于抽象类,无法实例化对象    

        

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值