• 派生类构造对象时,构造函数执行顺序


    先调用基类构造函数,再调用派生类构造函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    class Base
    {
    public:
        Base() { cout << "Base()" << endl;}
    };
     
     
    class Derived : public Base
    {
    public:
        Derived() { cout << "Derived()" << endl;}
    };
     
    int main()
    {
        Derived d;
        return 0;
    }

    输出:

    Base()
    Derived()

     

    先调用基类构造函数,再调用对象成员的构造函数,最后调用派生类构造函数.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19

    class Base
    {
    public:
        Base() { cout << "Base()" << endl;}
    };
     
     
    class Derived : public Base
    {
    public:
        Base b1, b2;
        Derived() { cout << "Derived()" << endl;}
    };
     
    int main()
    {
        Derived d;
        return 0;
    }

    输出:

    Base()
    Base()
    Base()
    Derived()

    先调用基类构造函数,再调用对象成员的构造函数(对象声明顺序,不是继承顺序,更不是初始化成员列表顺序),最后调用派生类构造函数.

    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

    class Base1
    {
    public:
        Base1() { cout << "Base1()" << endl;}
    };
     
    class Base2
    {
    public:
        Base2() { cout << "Base2()" << endl;}
    };
     
    class Derived : public Base1, public Base2
    {
    public:
        Base1 b1;
        Base2 b2;
        Derived() { cout << "Derived()" << endl;}
    };
     
    int main()
    {
        Derived d;
        return 0;
    }

    输出:

    Base1()
    Base2()
    Base1()
    Base2()
    Derived()

    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

    class Base1
    {
    public:
        Base1() { cout << "Base1()" << endl;}
    };
     
    class Base2
    {
    public:
        Base2() { cout << "Base2()" << endl;}
    };
     
    class Derived : public Base1, public Base2
    {
    public:
        Base2 b2;
        Base1 b1;
        Derived() { cout << "Derived()" << endl;}
    };
     
    int main()
    {
        Derived d;
        return 0;
    }

    输出:

    Base1()
    Base2()
    Base2()
    Base1()
    Derived()

    先调用虚基类构造函数,再调用其他基类构造函数,然后调用对象成员构造,最后调用派生类构造函数.

    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

    class Base1
    {
    public:
        Base1() { cout << "Base1()" << endl;}
    };
     
    class Base2
    {
    public:
        Base2() { cout << "Base2()" << endl;}
    };
     
    class Derived : public Base1,virtual public Base2
    {
    public:
        Base2 b2;
        Base1 b1;
        Derived() { cout << "Derived()" << endl;}
    };
     
    int main()
    {
        Derived d;
        return 0;
    }

    Base2()
    Base1()
    Base2()
    Base1()
    Derived()

    总结:先基类,再派生类;先虚基类,再其他基类;先对象成员,再派生类;顺序是声明顺序,而不是成员初始化列表顺序。

  • 相关阅读:
    HttpApplication处理对象与HttpModule处理模块
    HttpHandler与HttpModule的用处与区别
    ASP.NET管线与应用程序生命周期
    IIS架构与HTTP请求处理流程
    构造函数的选择与服务生命周期管理
    堆排序
    WebApi异常
    Java NIO内存映射---上G大文件处理(转)
    Spring+Mybatis+SpringMVC后台与前台分页展示实例(附工程)(转)
    redis入门(转)
  • 原文地址:https://www.cnblogs.com/helloweworld/p/3208718.html
Copyright © 2020-2023  润新知