Consequences of changing inheritance to virtual?

后端 未结 4 1266
礼貌的吻别
礼貌的吻别 2020-12-31 15:50

I\'m working on a huge project that I didn\'t start. My task is to add some additional functionality to what already is there. I\'m in a situation where I have to use virtua

4条回答
  •  借酒劲吻你
    2020-12-31 16:46

    The immediate consequence is that for regular inheritance, derived classes invoke the constructor of the immediate base, while for virtual inheritance, the most derived class (i.e. the one being instantiated directly) does, as this is the only place that would know all the virtual bases.

    Compare:

    struct A { A(int) { } };
    struct B : A { B(int i) : A(i) { } };
    struct C : B { C(int i) : B(i) { } };
    

    vs

    struct A { A(int) { } };
    struct B : virtual A { B(int i) : A(i) { } };
    // wrong: struct C : B { C(int i) : B(i) { } };
    struct C : B { C(int i) : A(i), B(i) { } }; // correct
    

    Also, the initializer behaviour is different, because the initializer for A in B is ignored if B is not the most derived class:

    struct A { A(int i) { cout << 'A' << i; } };
    struct B : virtual A { B(int i) : A(i+1) { cout << 'B' << i; } };
    struct C : B { C(int i) : A(i+1), B(i+1) { cout << 'C' << i; } };
    
    A a(0);        // prints A0
    B b(0);        // prints A1B0
    C c(0);        // prints A1B1C0
    

    If you had non-virtual inheritance here (which would force you to remove the A initializer in the C constructor, the third line would output A2B1C0.

提交回复
热议问题