• 基类和派生类析构函数执行顺序


    转载一片博客:

    http://www.cnblogs.com/dongling/p/5864295.html

    下面是自己实验结果:

    没有声明虚函数时:

    #include <iostream>
    using namespace std;
    
    class Base
    {
    public:
        Base()
        {
            cout<<"Base contruction"<<endl;
        }
         ~Base()
        {
            cout<<"Base deconstruction"<<endl;
        }
    
    };
    
    class Derived: public Base
    {
    public:
        Derived(int i)
        {
            num = i;
            cout<<"Derived contruction "<<num<<endl;
        }
         ~Derived()
        {
            cout<<"Derived deconstruction"<<num<<endl;
        }
    
    };
    
    int main()
    {
        Derived derived(1);
    
        Base* basePtr;
        Derived* derevedPtr;
        
        basePtr = new Derived(2);
        
        delete basePtr;
        
        
    
    
    }

    输出:

    Base contruction
    Derived contruction 1
    Base contruction
    Derived contruction 2
    Base deconstruction
    Derived deconstruction1
    Base deconstruction
    跟上面博文实验结果一致

    总结:
    由上面的实验结果可以看出,当 new CDerive() 时,会先运行基类的构造函数,然后再运行派生类的构造函数;
    而当 delete pointer 时,编译器只考虑 pointer 指针本身的类型而不关心 pointer 实际指向的类型,即:若 pointer 为基类指针,则只调用基类的析构函数(不管 pointer 实际指向的是基类还是派生类);若 pointer 是派生类指针,则先调用派生类的析构函数,再调用基类的析构函数,调用顺序与调用构造函数的顺序相反。

    在声明虚函数之后:

    #include <iostream>
    using namespace std;
    
    class Base
    {
    public:
        Base()
        {
            cout<<"Base contruction"<<endl;
        }
        virtual ~Base()
        {
            cout<<"Base deconstruction"<<endl;
        }
    
    };
    
    class Derived: public Base
    {
    public:
        Derived(int i)
        {
            num = i;
            cout<<"Derived contruction "<<num<<endl;
        }
        virtual ~Derived()
        {
            cout<<"Derived deconstruction"<<num<<endl;
        }
    
    };
    
    int main()
    {
        Derived derived(1);
    
        Base* basePtr;
        Derived* derevedPtr;
        
        basePtr = new Derived(2);
        
        delete basePtr;
        
        
    
    
    }

    输出:

    Base contruction
    Derived contruction 1
    Base contruction
    Derived contruction 2
    Derived deconstruction2
    Base deconstruction
    Derived deconstruction1
    Base deconstruction

  • 相关阅读:
    简单例子windows 共享内存 Demo -----(一)
    Qt qss浅析
    基于EntityFramework的权限的配置和验证
    快速获取Windows系统上的国家和地区信息
    Scorm 1.2 开发文档
    SQL Server 联表字段合并查询
    解决 ko mapping 数组无法添加新对象的问题
    SQL Server 数据库初始化准备脚本
    妾心如水,良人不来
    有趣的格子效果
  • 原文地址:https://www.cnblogs.com/hong2016/p/6699845.html
Copyright © 2020-2023  润新知