美文网首页
继承体系下的对象构造顺序

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

作者: 404Not_Found | 来源:发表于2021-09-14 00:11 被阅读0次
    • 作者: 雪山肥鱼
    • 时间:20210821 17:06
    • 目的: 继承体系下的对象构造顺序
    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编译器的情况是,不会走虚函数表,直接走函数地址。

    相关文章

      网友评论

          本文标题:继承体系下的对象构造顺序

          本文链接:https://www.haomeiwen.com/subject/ywzhgltx.html