首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虚析构与纯虚析构(C+)

纯虚函数和抽象类

概念

首先引入“纯虚函数”和“抽象类”的概念,示例代码如下

运行结果如下:

其中,称为纯虚函数,也即是在成员函数的开头加上关键词,且没有函数实现,取而代之的是末尾的,而一旦类中有一个纯虚函数,则该类被称为抽象类,抽象类具有以下特点:

抽象类无法实例化对象

抽象类的子类必须重写父类中的纯虚函数,否则也为抽象类

目的

纯虚函数和抽象类的存在是为了更好的契合多态的思想。关于多态,简而言之就是用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数

问题

纯虚函数的使用也会带来某些问题,由于实际调用时是父类指针指向子类对象,因此如果在子类中开辟了堆区数据,在析构时父类指针无法指向子类对象,即子类的析构函数不能够正常的被调用,这会带来内存泄漏的问题。例如下列代码:

运行结果如下:

可以看到子类的析构函数并未调用,要想解决该问题就需要继续引入“虚析构”与“纯虚析构”。

虚析构与纯虚析构

虚析构

虚析构的实现与虚函数一致,只需要在父类的析构函数前面加上关键字即可,只需要将前面代码中的Animal基类改成:

此时运行结果为:

可以看到此时的Cat正常析构,堆区数据被正常释放!

纯虚析构

与纯虚函数实现类似,将Animal基类做如下改动:

值得注意的是,纯虚析构必须在类外具体实现,否则将无法完成编译。拥有纯虚析构的类也叫做抽象类,无法实例化对象。

摘自https://cloud.tencent.com/developer/article/2141817

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230405A06MQJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券