博客
关于我
C++基类接口设计之虚析构函数
阅读量:799 次
发布时间:2023-04-16

本文共 1106 字,大约阅读时间需要 3 分钟。

最近在使用抽象类作为接口时,遇到了内存泄漏的问题。经过查阅相关资料,发现问题的根源在于基类的析构函数没有被设为虚函数。这对于理解虚函数和多态性的实现具有重要意义。

虚函数是指在基类中声明为virtual,并在派生类中重新定义的成员函数。例如,以下代码展示了一个虚函数:

virtual void fun();

纯虚函数则是将其声明为如下形式的成员函数,没有实现:

virtual void fun() = 0;

一个有纯虚函数的类被称为抽象类,这样的类无法实例化,只能作为其他类的基类。

在实际代码中,构建抽象类Father0,并通过其指针指向不同的子类,确实体现了多态性。例如,当指针指向Son2时,构造函数会从Father0开始,而析构函数则相反。这样,当子类没有提供特定的函数时,系统会向上一层查找并调用合适的函数。

如果不将基类的析构函数设为虚函数,会导致内存泄漏。因为在这种情况下,基类的析构函数不会被自动调用,子类的资源无法释放。例如,运行结果如下:

class Father init
class Son1 init
class Son2 init
this is a virtual function of Son1

而如果将基类的析构函数设为虚函数,运行结果则会正常释放内存:

class Father init
class Son1 init
class Son2 init
this is a virtual function of Son1
class Son2 destroyed
class Son1 destroyed
class Father destroyed

此外,如果将指针更改为Father类的指针,结果会显示:

class Father init
class Son1 init
class Son2 init
this is a virtual function of Son1
class Father destroyed

而如果直接使用子类指针,结果则会显示:

class Father init
class Son1 init
class Son2 init
this is a virtual function of Son1
class Son2 destroyed
class Son1 destroyed
class Father destroyed

总之,在使用抽象类和虚函数实现多态时,设置基类析构函数为虚函数是非常重要的。同时,选择合适的指针类型(如直接使用子类指针)可以更有效地管理内存,避免泄漏。这些知识对于编写稳定且高效的C++程序至关重要。

转载地址:http://sygfk.baihongyu.com/

你可能感兴趣的文章
Oracle11G基本操作
查看>>
Oracle11g服务详细介绍及哪些服务是必须开启的?
查看>>
Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
查看>>
oracle12安装软件后安装数据库,然后需要自己配置监听
查看>>
Oracle——08PL/SQL简介,基本程序结构和语句
查看>>
Oracle——distinct的用法
查看>>
Oracle、MySQL、SQL Server架构大对比
查看>>
oracle下的OVER(PARTITION BY)函数介绍
查看>>
Oracle中DATE数据相减问题
查看>>
Oracle中merge into的使用
查看>>
oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
查看>>
oracle中sql的case语句运用--根据不同条件去排序!
查看>>
Oracle中Transate函数的使用
查看>>
oracle中关于日期问题的汇总!
查看>>
Oracle中常用的语句
查看>>
Oracle中序列的操作以及使用前对序列的初始化
查看>>
oracle中新建用户和赋予权限
查看>>
Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
查看>>
Oracle中的rownum 和rowid的用法和区别
查看>>
oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
查看>>