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

  • 相关阅读:
    Sql Server Profiler使用
    用PowerDesign反向生成数据库Sql语句问题
    使用PowerDesign15反向生成数据库
    离线安装Sharepoint工具
    开发Windows服务
    Windows Server 2008 R2 安装域
    Entity Framework执行Sql语句返回DataTable
    GO 学习资源收集
    Ubuntu常用命令大全
    MVC MVC3中 ViewBag、ViewData和TempData的使用和区别 【转】
  • 原文地址:https://www.cnblogs.com/hong2016/p/6699845.html
Copyright © 2011-2022 走看看