zoukankan      html  css  js  c++  java
  • C++ 虚析构函数

    C++类里面,我们经常可以看到析构函数是虚函数,这个虚函数有什么作用吗?我们可以通过一个很简单的例子来看看虚析构函数的作用。

    #include<iostream>
    using namespace std;
    
    class CBase
    {
        public:
            /*virtual*/ ~CBase()
            {   
                cout << "CBase::~CBase()
    ";
            }   
    };
    
    class CChild: public CBase
    {
        public:
            virtual ~CChild()
            {   
                cout << "CChild::~CChild()
    ";
            }   
    };
    
    int main()
    {
        CChild* p = new CChild();
        delete p;
    
        cout << endl;
        CBase* p2 = new CChild();
        delete p2; 
    
        return 0;
    }
    ~ 

    输出:

    CChild::~CChild()
    CBase::~CBase()
    
    CBase::~CBase()

    使用虚拟析构函数:

    include<iostream>
    using namespace std;
    
    class CBase
    {
        public:
            virtual ~CBase()
            {   
                cout << "CBase::~CBase()
    ";
            }   
    };
    
    class CChild: public CBase
    {
        public:
            virtual ~CChild()
            {   
                cout << "CChild::~CChild()
    ";
            }   
    };
    
    int main()
    {
        CChild* p = new CChild();
        delete p;
    
        cout << endl;
        CBase* p2 = new CChild();
        delete p2; 
    
        return 0;
    }

    输出:

    include<iostream>
    using namespace std;
    
    class CBase
    {
        public:
            virtual ~CBase()
            {   
                cout << "CBase::~CBase()
    ";
            }   
    };
    
    class CChild: public CBase
    {
        public:
            virtual ~CChild()
            {   
                cout << "CChild::~CChild()
    ";
            }   
    };
    
    int main()
    {
        CChild* p = new CChild();
        delete p;
    
        cout << endl;
        CBase* p2 = new CChild();
        delete p2; 
    
        return 0;
    }

    总结:

    delete p的时候调用基类还是子类的析构函数呢?其实这个问题很简单,p是CChild指针(子类),那么自然调用子类的析构函数了。基类析构函数会被调用吗?答案是肯定的,其实这个是C++的特性,子类的析构函数会自动调用基类的析构函数。子类析构是这样的过程:

    1. 析构子类扩展部分(也就是运行子类析构函数代码);

    2. 在子类析构函数返回之前调用基类析构函数来释放基类部分。

    这个过程跟析构函数是否是虚函数无关。也就是说:

    无论析构函数是否是虚函数,子类的析构函数一定会调用基类的析构函数。顺序是先析构子类部分,再析构基类部分。

    (对于构造函数,我们可以在子类的构造函数里面选择调用基类的某一个构造函数,如果不在子类里面显式地调用基类构造函数,那么系统自动会调用基类的默认构造函数。顺序刚好和析构相反,先构造基类部分,再构造子类部分)

    对于delete一个指向子类的基类指针(P2):

    1. 对于虚析构函数,那么就是基类和子类的析构函数都会被调用,先析构子类部分,再析构基类部分。(基类析构函数是被子类析构函数自动调用的)

    2. 对于非虚析构函数,子类析构函数不会被调用,只有基类析构函数才会被调用。

  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/diegodu/p/4434612.html
Copyright © 2011-2022 走看看