53 C++ - 虚析构函数

简介: 53 C++ - 虚析构函数

1.虚析构函数作用

虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。

class People{
public:
  People(){
    cout << "构造函数 People!" << endl;
  }
  virtual void showName() = 0;
  virtual ~People(){
    cout << "析构函数 People!" << endl;
  }
};
class Worker : public People{
public:
  Worker(){
    cout << "构造函数 Worker!" << endl;
    pName = new char[10];
  }
  virtual void showName(){
    cout << "打印子类的名字!" << endl;
  }
  ~Worker(){
    cout << "析构函数 Worker!" << endl;
    if (pName != NULL){
      delete pName;
    }
  }
private:
  char* pName;
};
void test(){
  People* people = new Worker;
  people->~People();
}

2. 纯虚析构函数

纯虚析构函数在c++中是合法的,但是在使用的时候有一个额外的限制:必须为纯虚析构函数提供一个函数体。

那么问题是:如果给虚析构函数提供函数体了,那怎么还能称作纯虚析构函数呢?

纯虚析构函数和非纯析构函数之间唯一的不同之处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。

//非纯虚析构函数
class A{
public:
  virtual ~A();
};
A::~A(){}
//纯析构函数
class B{
public:
  virtual ~B() = 0;
};
B::~B(){}
void test(){
  A a; //A类不是抽象类,可以实例化对象
  B b; //B类是抽象类,不可以实例化对象
}

如果类的目的不是为了实现多态,作为基类来使用,就不要声明虚析构函数,反之,则应该为类声明虚析构函数。

目录
相关文章
|
6月前
|
存储 Cloud Native 编译器
C++ 虚析构函数的作用?
C++ 虚析构函数的作用?
|
10月前
|
存储 编译器 C++
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
100 0
|
缓存 Java 编译器
C++中为多态基类声明虚析构函数
C++中为多态基类声明虚析构函数
178 0
|
C++ 容器 C语言
读书笔记 effective c++ Item 7 在多态基类中将析构函数声明为虚析构函数
1. 继承体系中关于对象释放遇到的问题描述 1.1 手动释放 关于时间记录有很多种方法,因此为不同的计时方法创建一个TimeKeeper基类和一些派生类就再合理不过了: 1 class TimeKeeper { 2 3 public: 4 5 TimeKeeper(); 6 7 ~TimeKeeper(); 8 9 .
1115 0
|
C++
C++语言基础 例程 虚析构函数
贺老师的教学链接  本课讲解 问题的由来 #include &lt;iostream&gt; using namespace std; class Point { public: Point( ) { } ~Point() { cout&lt;&lt;"executing Point destructor"&lt;&lt;endl; } };
950 0
|
C++
C++虚析构函数解析
  当派生类对象从内存中撤销时一般先运行派生类的析构函数,然后再调用基类的析构函数。 如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对象当用delete运算符撤销对象时,系统执行的是基类的析构函数,而不是派生类的析构函数,不能彻底的“清理现场”。
784 0
C++构造函数、析构函数、虚析构函数
1.构造函数   C++中的构造函数是用于初始化类的各种变量以及分配资源等。主要的注意事项是:   (1)在继承关系中先初始化父类对象后初始化子类对象。   (2)在一个类中按照变量的声明顺序,对类中的变量进行初始化。
1241 0
|
C++
C++学习笔记 -- 虚析构函数与纯虚析构函数
开始学C++了,所以又重拾以前学习过的相关概念… 析构函数是当一个对象的生命周期结束时,会自动执行析构函数。 析构函数的定义: #ifndef __A_H__#define __A_H__class A{public: A(void); A(int a, int b); ...
1418 0
|
1天前
|
编译器 C++
【C++】一文全解四种经典 [ 特殊类 ]的设计
【C++】一文全解四种经典 [ 特殊类 ]的设计
|
2天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)