zoukankan      html  css  js  c++  java
  • 基类和派生类析构函数执行顺序

    转载一片博客:

    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

  • 相关阅读:
    python之os模块分类整理
    MySql的四种事务隔离级别
    Ajax异步请求XMLHttpRequest对象Get请求
    经典mssql语句大全
    Repeater 无刷新分页
    关于编写性能高效的javascript事件的技术
    ASP.NET页面之间数据传递的几种方法
    MSSQL常用函数大全
    .net-一般处理程序及生命周期
    请求管道中的19个事件
  • 原文地址:https://www.cnblogs.com/hong2016/p/6699845.html
Copyright © 2011-2022 走看看