继承体系下的对象构造顺序

2021-09-14  本文已影响0人  404Not_Found
namespace _nmsp1
{
    //构造顺序,并非单纯的 先调用A B C ,而是 A 的构造函数 调用了B 的构造函数,B的构造函数调用了C 的构造函数
    class A
    {
    public:
        A()
        {
            cout << "A:A()" << endl;
        }
        virtual ~A()
        {

        }
    };
    class B:public A
    {
    public:
        B()
        {
            cout << "B:B()" << endl;
        }
        virtual ~B()
        {

        }
    };
    class C :public B
    {
    public:
        C()
        {
            cout << "C:C()" << endl;
        }
        virtual ~C()
        {

        }
    };
    void fun()
    {
        C obj;

    }
}

构造顺序,起始应该叫做构造调用顺序。并非单纯的 先构造 A 再B,最后C。应该说C的构造函数,调用构造函数B的构造函数,B的构造函数调用了A的构造函数。

    class C :public B
    {
        //这个 m_c 初始化列表 是在 A B 构造函数结束后,开始赋值的,然后才执行构造函数内部逻辑
    public:
        C() :m_c(11)
        {
            cout << "C:C()" << endl;
        }
        virtual ~C()
        {

        }
        int m_c;
    };

另外补充: 初始化列表是在A B 构造函数结束后,才开始赋值,最后执行内逻辑的。

多继承中的虚函数流程

A 的虚函数给C, B 的虚函数也会给C,类C只会维护一张虚表。

构造函数中调虚函数

貌似这样德应用场景很少,但是根据vs2017编译器的情况是,不会走虚函数表,直接走函数地址。

上一篇下一篇

猜你喜欢

热点阅读