zoukankan      html  css  js  c++  java
  • 只有基类的析构函数需要为虚函数

    //
    //  main.cpp
    //  TescDtor
    //
    //  Created by Jiacan Li on 6/16/17.
    //  Copyright © 2017 Jiacan Li. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    
    class ClxBase1
    {
    public:
        ClxBase1()
        {
        }
        
        virtual ~ClxBase1()
        {
            cout<<"~ClxBase1"<<endl;
        }
    };
    
    class ClxBase2 : public ClxBase1
    {
    public:
        ClxBase2()
        {
        }
        
        ~ClxBase2()
        {
            cout<<"~ClxBase2"<<endl;
        }
    };
    
    class ClxDerived : public ClxBase2
    {
    public:
        ClxDerived()
        {
            
        }
        
        ~ClxDerived()
        {
            cout << "~ClxDerived" << endl;
        }
    };
    
    int main(int argc, const char * argv[])
    {
        ClxBase1* cp = new ClxDerived();
        delete cp;
        int i = 0;
    }

    将一个子类的对象赋值给父类指针,当删除该指针时,如果没有将基类的指针写为虚函数,那么只会调用基类的析构函数。

    测试上面的代码:

    1、ClxBase1* cp = new ClxDerived(); 当删除指针时,会打印三条Log;

    2、ClxBase2* cp = new ClxDerived(); 当删除指针时,会打印三条Log;

    可见,只要在根类上生命虚析构函数,则删除任意子类指针的时候,都会顺序调用继承树路径上的析构函数。

    在Clang和MSVC测试,行为一直。

  • 相关阅读:
    数据结构_队列和滑动窗口
    数据结构_栈和单调栈
    数据结构_链表及邻接表
    JavaSE多线程
    AppExtension总结
    FlutterBloc 2.1.1迁移至6.0.6
    iOS通知总结
    Provider 4.3.2+2 f
    Fish-Redux 研究
    王道考研复习-操作系统-内存管理(三)
  • 原文地址:https://www.cnblogs.com/lilei9110/p/7029004.html
Copyright © 2011-2022 走看看