C++的虚析构详解及实例代码

C++的虚析构

最近准备复习一遍所有的知识点,先从基础开始做起,用几分钟写个继承和析构吧。

父类为A,子类为B,代码如下:

class A
{
 public:
 A()
 {
   cout << "构造A"<< endl;
 }
 ~A()
 {
  cout << "析构A" << endl;
  }
}
class B:public A
{
 public:
 B()
 {
 cout << "构造B"<< endl;
 }
 ~B()
 {
 cout << "析构B"<< endl;
 }

}

这个时候在main函数里,

定义一个A的对象,A a;运行输出结果为:构造A 析构A。

定义一个B的对象, B b;运行的输出结果为:构造B 析构B。

定义一个A的指针,指向B。A *P = new b; 运行输出结果为:构造A 构造B.这个时候很多人就容易出问题了,为啥没调用析构呢,这个也是经常遇到的问题,最简单也是最容易遗忘的。new出来的对象没有删,还有写一行代码 delete p;这个时候的运行输出结果为:构造A 构造B 析构A。又出现问题了,B的析构怎么没走,这个时候需要一用虚析构这个概念,虚析构的功能:父类的析构写成虚析构,在删除父类的指针的时候,可以删除子类的对象,避免内存泄漏。

具体操作就是把上面代码的第八行,前面加一个virtual。这个时候再运行输出结果为:构造A 构造B 析构B 析构A。注意这里也可以看出调用顺序,先走父类的构造,然后子类的构造。先走子类的析构,最后走父类的析构。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 解析C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:    有下面的两个类: 复制代码 代码如下: class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {};    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };}

  • C++虚析构函数的使用分析

    在C++中,不能声明虚构造函数,但可以声明虚析构函数.多态性是指不同的对象对同一消息有不同的行为特性.虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的.析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的.首先解释一下虚构函数和指针之间是如何交互的,以及虚析构函数的具体含义.例如以下代码,其中SomeClass是含有非virtual析构函数的一个类:SomeClass *p= new SomeCla

  • 简要解读C++的动态和静态关联以及虚析构函数

    C++静态关联与动态关联.C++是怎样实现多态性的 在现实生活中,多态性的例子是很多的.我们分析一下人是怎样处理多 态性的.例如,新生被录取人大学,在人学报到时,先有一名工作人员审查材料,他的职责是甄别资格,然后根据录取通知书上注明的录取的系和专业,将材料转到有关的系和专业,办理具体的注册人学手续,也可以看作调用不同部门的处理程序办理入学手续.在学 生眼里,这名工作人员是总的人口,所有新生办入学手续都要经过他.学生拿的是统一的录取通知书,但实际上分属不同的系,要进行不同的注册手续,这就是多态.那

  • C++的虚析构详解及实例代码

    C++的虚析构 最近准备复习一遍所有的知识点,先从基础开始做起,用几分钟写个继承和析构吧. 父类为A,子类为B,代码如下: class A { public: A() { cout << "构造A"<< endl; } ~A() { cout << "析构A" << endl; } } class B:public A { public: B() { cout << "构造B"<&

  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"

  • MySQL 序列 AUTO_INCREMENT详解及实例代码

    MySQL 序列 AUTO_INCREMENT详解及实例代码 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. 使用AUTO_INCREMENT MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列. 实例 以下实例中创建了数据表insect, insect中id无需指定值可实现自动增长. mysql>

  • Java 两种延时thread和timer详解及实例代码

    Java 两种延时thread和timer详解及实例代码 在Java中有时候需要使程序暂停一点时间,称为延时.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如 try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} 在这里需要解释一下线程沉睡的时间.sleep()方法并不能够让程序"严格"的沉睡指定的时间.例如当使用5000作为sleep()方法的参数时,线 程

  • Spring组件自动扫描详解及实例代码

    Spring组件自动扫描详解及实例代码 问题描述 一个系统往往有成千上万的组件,如果需要手动将所有组件都纳入spring容器中管理,是一个浩大的工程. 解决方案 Spring 提供组件扫描(component scanning)功能.它能从classpath里自动扫描.侦测和实例化具有特定注解的组件.基本的注解是@Component,它标识一个受Spring管理的组件.其他特定的注解有@Repository.@Service和@Controller,它们分别标识了持久层.服务处和表现层的组件.

  • Java中自定义异常详解及实例代码

    Java中自定义异常详解及实例代码 下面做了归纳总结,欢迎批评指正 自定义异常 class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(msg); } } 自定义异常 En

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • java多线程编程技术详解和实例代码

     java多线程编程技术详解和实例代码 1.   Java和他的API都可以使用并发. 可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序范围内的资源,比如共享内存,这种能力被称为多线程编程(multithreading),在核心的C和C++语言中并不具备这种能力,尽管他们影响了JAVA的设计. 2.   线程的生命周期 新线程的生命周期从"新生"状态开始.程序启动线程前,线程一直是"新生"状态:

  • JS 实现计算器详解及实例代码(一)

    Javascript 实现计算器: 系列文章: JS 实现计算器详解及实例代码(一) Javascript 实现计算器时间功能详解及实例(二) 小型JavaScript计算器 自己寻思出的解决方案,比较笨拙的方法,虽然完成了但是还有不少bug,用的方法也不是最有效的,基本功能算是完成了,一些小的细节地方也考虑到了,但是还有其他的细节需要处理. 总体设计思路是,先画草图 -> 设计UI -> 编写UI代码 -> 编写CSS -> 编写JS逻辑代码: 面板(main-board) 面板

  • java 单播、广播、组播详解及实例代码

    java 单播.广播.组播详解及实例代码 在当前网络通信中(TCP/IP也不例外)有三种通信模式:单播.广播.组播(又叫多播, 个人感觉叫多播描述的有点不恰当),其中多播出现的时间最晚,但同时具备单播和广播的优点,最具有发展前景. 一.通信方式分类: 1.单播:单台主机与单台主机之间的通信: 2.广播:单台主机与网络中所有主机的通信: 3.组播:单台主机与选定的一组主机的通信: 二.单播:    单播是网络通信中最常见的,网络节点之间的通信 就好像是人们之间的对话一样.如果一个人对另外一个人说话

随机推荐