C++析构函数定义为virtual虚函数,有什么作用?

简介: C++析构函数定义为virtual虚函数,有什么作用?

C++析构函数定义为virtual虚函数,有什么作用?

简介:析构函数定义为virtual虚函数,有什么作用?

代码讲解

简单的说,C++中基类采用virtual虚析构函数是为了防止内存泄漏,如果派生类中申请了内存空间,并在析构函数中对这些内存空间进行了释放。

如果这个时候基类中采取的是非虚构函数,那么当删除基类指针的死后,指向派生类对象的时候就不会发生动态绑定,导致的结果就是,调用基类的析构函数,而不会调用派生类的析构函数。

再这样的情况下对于派生类申请的空间就得不到释放从而产生了内存泄漏。

为了防止这样的情况发生,C++中基类的析构函数就需要采取virtual的虚构函数,实现动态绑定,这样才可以。

至于什么是动态绑定与静态绑定可以看看这篇文章:动态多态与静态多态

学习代码:

#include<iostream>
using namespace std;
class A
{
public:
    A(){
    }
    ~A(){
        cout << "A discontruct" << endl;
    }
  virtual string OnPaint() = 0; // 定义接口
};
class B : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "B" << endl;
    return "B";
  }
  ~B(){
      cout << "B discontruct" << endl;
  }
};
class C : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "C" << endl;
    return "C";
  }
  ~C(){
      cout << "C discontruct" << endl;
  }
};
int main()
{
  A* p = new B();
  p->OnPaint(); // B
  delete p;
  p = new C(); 
  p->OnPaint(); // C
  delete p;
  return 0;
}

运行结果

通过运行结果我们可以发现,派生类的内存没有得到释放。

改进办法

#include<iostream>
using namespace std;
class A
{
public:
    A(){
    }
    virtual ~A(){
        cout << "A discontruct" << endl;
    }
  virtual string OnPaint() = 0; // 定义接口
};
class B : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "B" << endl;
    return "B";
  }
  virtual ~B(){
      cout << "B discontruct" << endl;
  }
};
class C : public A
{
public:
  virtual string OnPaint()
  {
    cout<< "C" << endl;
    return "C";
  }
  virtual ~C(){
      cout << "C discontruct" << endl;
  }
};
int main()
{
  A* p = new B();
  p->OnPaint(); // B
  delete p;
  p = new C(); 
  p->OnPaint(); // C
  delete p;
  return 0;
}

运行结果

通过把析构函数定义为虚函数,实现了派生类的内存释放。

相关文章
|
2月前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
32 0
|
2天前
|
编译器 C++
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
|
6天前
|
C++
C++虚函数学习笔记
C++虚函数学习笔记
11 0
|
13天前
|
数据安全/隐私保护 C++
C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
C++ 中的类方法(成员函数)分为类内定义和类外定义,用于操作类数据。类内定义直接在类中声明和定义,而类外定义则先在类中声明,再外部定义。方法可以有参数,访问权限可通过 public、private 和 protected 控制。静态方法与类关联,不依赖对象实例,直接用类名调用。了解这些概念有助于面向对象编程。
14 0
|
15天前
|
编译器 C++
【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数
【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数
|
15天前
|
编译器 C语言 C++
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装
|
21天前
|
编译器 C语言 C++
【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
【C++专栏】C++入门 | 类和对象 | 类的引入、struct&class的区别、类的定义
12 0
|
22天前
|
存储 编译器 程序员
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
|
1月前
|
C++
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
|
2月前
|
编译器 C语言 C++
【c++】类和对象(三)构造函数和析构函数
朋友们大家好,本篇文章我们带来类和对象重要的部分,构造函数和析构函数