zoukankan      html  css  js  c++  java
  • 有继承的C++析构函数一定要用virtual

    先补下virtual是啥

    虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。 

     

    先贴个代码,再解释

    #include <iostream>
    
    using namespace std;
    
    class Base
    {
    public:
        Base(){cout<<"Base Construct"<<endl;};
        ~Base(){cout<<"Base destroy"<<endl;}
           
    };
    
    class A : public Base
    {
    public:
        A(){cout<<"A Construct"<<endl;}
        ~A(){cout<<"A destroy"<<endl;}
    };
    class Base1
    {
    public:
        Base1(){cout<<"Base1 Construct"<<endl;};
        virtual  ~Base1(){cout<<"Base1 destroy"<<endl;}
           
    };
    
    class A1 : public Base1
    {
    public:
        A1(){cout<<"A1 Construct"<<endl;}
        ~A1(){cout<<"A1 destroy"<<endl;}
    };
    
    int main()
    {
        Base* p = new A;
        delete p;
        cout<<"======================"<<endl;
        Base1* p1 = new A1;
        delete p1;
        return 0;
    }
    /*
      Base Construct
      A Construct
      Base destroy
      ======================
      Base1 Construct
      A1 Construct
      A1 destroy
      Base1 destroy
    */

    在代码尾部的注释就是输出。

    Base的析构函数没有virtual

    Base1的析构函数有virtual

    Base* p = new A

    delete p

    这个过程只调用了Base的析构函数,没有调用A的析构函数。

    这样在实际应用中会有不确定的后果,可能会memory leak

    应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。

    所以要给Base的析构函数以virtual属性。

    by 1957
  • 相关阅读:
    软件工程--团队作业2
    软件工程——团队作业1
    软件工程第二次作业——四则运算结对编程3.0版本(最终版本)
    软件工程第一次作业补充
    软件工程第一次作业
    实验一
    Qt-关于QTreeView的一些设置
    Qt-QTreeView绘制单元格
    NX二次开发-获取集成环境下打开的part名
    NX二次开发-NX是否处于集成环境下
  • 原文地址:https://www.cnblogs.com/x1957/p/2734918.html
Copyright © 2011-2022 走看看