zoukankan      html  css  js  c++  java
  • 为什么一般要定义析构函数为虚析构函数

    没有使用虚析构函数可能会出现的问题:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class A {
    public:
    	A() { cout << "A constructor" << endl; }
    	~A() { cout << "A destructor" << endl; }
    };
    
    class B: public A {
    	char *buf;
    public:
    	B() { buf = new char[10]; cout << "B constructor" << endl; }
    	~B() { cout << "B destructor" << endl; }
    };
    
    int main()
    {
    	A *p = new B;
    	delete p;  // p是基类类型指针,仅调用基类析构函数,造成B中申请的10字节内存没被释放。
    	return 0;
    }
    
    

    输出:

    A constructor
    B constructor
    A destructor

    解决:将基类中的析构函数定义为虚析构函数

    #include <iostream>
    #include <string>
    using namespace std;
    
    class A {
    public:
    	A() { cout << "A constructor" << endl; }
    	virtual ~A() { cout << "A destructor" << endl; }
    };
    
    class B: public A {
    	char *buf;
    public:
    	B() { buf = new char[10]; cout << "B constructor" << endl; }
    	~B() { cout << "B destructor" << endl; }
    };
    
    int main()
    {
    	A *p = new B;
    	delete p; //A中的析构函数说明为虚析构函数后,B中析构函数自动成为虚析构函数,由于P
                      //指向派生类对象,因此会调用派生类B的析构函数。
    	return 0;
    }
    
    

    输出:

    A constructor
    B constructor
    B destructor
    A destructor

  • 相关阅读:
    redis运维手册
    grafana展示ES中的nginx日志-地图展示
    nginx针对yum安装nginx重编译
    K8S-yaml里初始化容器
    K8S-资源配置清单补充1
    K8S-资源配置清单详解
    Docker cp 提示“no space left on device”
    磁盘
    ansible 对文件内容的操作
    ansible 初始化系统分区格式化
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2858785.html
Copyright © 2011-2022 走看看