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测试,行为一直。

  • 相关阅读:
    数据库作业
    数据库知识点⑤
    数据库知识点④
    一个值得纪念的日子
    设计模式之单件模式
    HDU 5441 Travel
    HDU 5483 Nux Walpurgis
    Markdown 测试
    HDU 3271 SNIBB
    HDU 5536 Chip Factory
  • 原文地址:https://www.cnblogs.com/lilei9110/p/7029004.html
Copyright © 2011-2022 走看看