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;
}

运行结果

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

相关文章
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
25 4
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
29 2
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
2月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
3月前
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
3月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
3月前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
3月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
3月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
46 0