C++虚析构函数基本内容概述

开发 后端
我们在这里将会通过一段代码示例的解读来为大家详细分析一下C++虚析构函数的相关应用方法以及基本概念,让大家对此有一个充分的掌握。

 

今天,我们将会在这篇文章中为大家详细介绍一下C++虚析构函数的一些基本知识。相信对于刚刚接触C++编程语言的初学者们现在急需要诸如这方面的基础知识的讲解内容,以加大自己对这一语言的认知。#t#

C++的多态性是通过虚函数来实现的,虚函数的出现使得动态链接成为可能。

基于构造函数的特点,不能将构造函数定义为虚函数,但可以将析构函数定义为虚函数。当派生类的对象从内存中撤销时,会先调用派生类的析构函数,然后自动调用基类的析构函数,如此看来析构函数也没有必要定义为虚函数。

但是考虑如下这种情况,如果使用基类指针指向派生类的对象,而这个派生类对象恰好是用new运算创建的,这种情况下会如何呢?当程序使用delete运算撤销派生类对象时,这时只会调用基类的析构函数,而没有调用派生类的析构函数。如果使用的是虚析构函数的话,就不一样了,所以定义虚析构函数有时候还是很有必要的。下面这段程序就说明了上面的问题:

没有定义虚C++虚析构函数时,code如下:

 

#include < iostream> 
using namespace std;  
class A  
{  
public:  
A(){}  
~A()  
{  
cout< < "A::destructor"< < endl;  
}  
};  
class B:public A   
{  
public:  
B(){}  
~B()  
{  
cout< < "B::destructor"< < endl;  
}  
};  
int main()  
{  
A *pA = new B;  
//  
delete pA;  
return 0;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

输出的是A::destructor

这说明delete pA只是调用了基类A的析构函数,而没有调用子类B的析构函数,这不是我们所想要的。而把基类A的析构函数定义为虚函数后,就可以达到了我们所想要的效果了。code如下:

#include < iostream> 
using namespace std;  
class A  
{  
public:  
A(){}  
virtual ~A()  
{  
cout< < "A::destructor"< < endl;  
}  
};  
class B:public A   
{  
public:  
B(){}  
~B()  
{  
cout< < "B::destructor"< < endl;  
}  
};  
int main()  
{  
A *pA = new B;  
//  
delete pA;  
return 0;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

输出如下:

B::destrutor

A::destrutor

以上就是对C++虚析构函数的相关介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-06 13:58:13

C++ Bost库

2010-02-02 15:12:09

C++ explici

2024-12-19 14:42:15

C++内存泄漏内存管理

2010-02-05 10:08:55

C++名字空间

2010-02-04 15:51:07

C++迭代器

2025-02-18 00:08:00

代码C++RAII

2010-01-28 15:33:37

Android程序架构

2010-03-02 15:53:02

WCF服务合同

2010-01-18 15:53:27

C++析构函数

2010-02-04 16:39:26

C++析构函数

2010-03-02 17:55:37

WCF终结点地址

2010-02-03 15:06:02

C++可变参数表

2011-07-15 01:29:39

C++析构函数

2010-02-25 17:04:54

WCF实例上下文

2009-08-14 17:24:28

C#构造函数和析构函数

2009-09-03 13:14:55

C#构造函数C#析构函数

2010-01-04 15:21:37

Silverlight

2009-09-10 10:47:05

C# form

2010-02-01 11:22:09

C++虚函数

2022-07-18 15:32:37

C++虚函数表
点赞
收藏

51CTO技术栈公众号