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

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

 

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

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

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

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

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

 

  1. #include < iostream> 
  2. using namespace std;  
  3. class A  
  4. {  
  5. public:  
  6. A(){}  
  7. ~A()  
  8. {  
  9. cout< < "A::destructor"< < endl;  
  10. }  
  11. };  
  12. class B:public A   
  13. {  
  14. public:  
  15. B(){}  
  16. ~B()  
  17. {  
  18. cout< < "B::destructor"< < endl;  
  19. }  
  20. };  
  21. int main()  
  22. {  
  23. A *pA = new B;  
  24. //  
  25. delete pA;  
  26. return 0;  

输出的是A::destructor

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

  1. #include < iostream> 
  2. using namespace std;  
  3. class A  
  4. {  
  5. public:  
  6. A(){}  
  7. virtual ~A()  
  8. {  
  9. cout< < "A::destructor"< < endl;  
  10. }  
  11. };  
  12. class B:public A   
  13. {  
  14. public:  
  15. B(){}  
  16. ~B()  
  17. {  
  18. cout< < "B::destructor"< < endl;  
  19. }  
  20. };  
  21. int main()  
  22. {  
  23. A *pA = new B;  
  24. //  
  25. delete pA;  
  26. return 0;  

输出如下:

B::destrutor

A::destrutor

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

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

2010-02-06 13:58:13

C++ Bost库

2010-02-02 15:12:09

C++ explici

2010-02-04 15:51:07

C++迭代器

2010-02-05 10:08:55

C++名字空间

2010-03-02 15:53:02

WCF服务合同

2010-01-28 15:33:37

Android程序架构

2010-02-04 16:39:26

C++析构函数

2010-01-18 15:53:27

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

2022-07-18 15:32:37

C++虚函数表

2010-02-01 11:22:09

C++虚函数

2010-01-18 17:38:54

C++虚函数表

2021-12-11 19:02:03

函数C++对象
点赞
收藏

51CTO技术栈公众号