• 基类构造析构函数、子类构造析构函数和子类成员变量构造析构函数的调用顺序


    对于构造函数:基类构造函数 > 子类成员变量构造函数 > 子类构造函数
    对于析构函数:子类析构函数 > 子类成员变量析构函数 > 基类析构函数
    可以看出构造函数的调用过程和析构函数的调用过程正好相反。
    例题:
    下面代码的输出是什么?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class A  
    {  
    public:  
        A()  {     }  
        ~A() {    cout<<"~A"<<endl;   }  
    };  
       
    class B:public A  
    {  
        public:  
            B(A &a):_a(a)  
            {  
                 
            }  
            ~B()  
            {  
                cout<<"~B"<<endl;  
            }  
        private:  
            A _a;  
        };  
           
    int main(void)  
     {  
            A a;       //很简单,定义a的时候调用了一次构造函数  
            B b(a); 
    }

    output:

    ~B
    ~A
    ~A
    ~A
    解析:
    main函数中首先构造变量a,然后是b。在构造b时首先调用b的基类A的构造函数,然后调用b中成员变量_a的构造函数,最后调用b的构造函数。
    main函数调用结束返回时,变量的释放顺序跟变量的构造顺序正好相反。首先释放变量b,然后是变量a。
    在释放变量b时,首先调用b的析构函数,然后析构变量b的成员_a,析构_a时调用_a的析构函数。再调用b的基类的析构函数。
    然后是释放变量a,调用a的析构函数。
     
    本例子中应该将A的析构函数更改为virtual的,防止使用多态机制时出现子类对象无法释放的情况,本例子中没有用到多态机制,不存在该问题。
  • 相关阅读:
    Spring 梳理-启用MVC
    Spring 梳理-MVC-配置DispatcherServet和ContextLoaderListener
    Spring 梳理-MVC-前端控制器DispatchServlet及URL请求处理过程
    Spring 梳理-AOP
    Spring 梳理-运行时动态注入bean
    Spring 梳理-bean作用域
    Spring 梳理-profile与条件化定义bean
    Spring 梳理-bean配置与装配
    Spring 梳理-容器(container)
    iframe
  • 原文地址:https://www.cnblogs.com/upup-2015/p/5050379.html
Copyright © 2020-2023  润新知