learn C++ NO.18——多态

什么是多态?

多态是C++面向对象编程中的一个核心概念,它允许程序在执行过程中,根据对象的实际类型来调用适当的函数。多态性主要通过继承和虚函数来实现,这使得代码更加灵活和可扩展。多态的条件如下:1、调用函数是重写的虚函数。2、基类指针或者引用。

虚函数的概念

被virtual修饰的成员函数就是虚函数。
在这里插入图片描述

虚函数的重写

虚函数重写是指派生类重新定义(或称为覆盖)了基类中的虚函数。当派生类中存在一个与基类中虚函数具有三同,即相同名称、参数列表和 返回值(在C++11及以后版本中,还包括const属性和volatile属性)的函数时,该函数就重写了基类中的虚函数。

下面通过一个代码样例来简单看一看
在这里插入图片描述
在这里插入图片描述

在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样写。

在这里插入图片描述

协变是虚函数重写的一个特例。协变是指派生类重写虚函数时,与基类虚函数返回值类型不同。但是基类虚函数返回值类型是基类的指针或引用。派生类虚函数的返回值类型是派生类的指针或引用。

在这里插入图片描述
析构函数的重写也是一个特殊的例子。如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

为什么需要重写虚函数呢?通过下面场景便可以明白。

在这里插入图片描述
可以看到在释放Student的切片时,编译器没有去调用派生类的析构函数释放派生类对象部分,这导致了内存泄露问题。因为delete底层是会去让p对象去调用它的析构函数,然后调用operator delete来释放空间。在这个场景中用户期望调用析构函数的行为是一个多态调用。所以,我们需要重写析构函数以达到正常释放派生类对象的目的。

在这里插入图片描述
C++11标准提供了两个关键字,override 和 f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩铁的sinZz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值