Порядок вызова конструктора в виртуальном наследовании

class A {
        int i;
public: 
        A() {cout<<"in A's def const\n";};
        A(int k) {cout<<"In A const\n";  i = k; }
        };

class B : virtual public A {
public:
        B(){cout<<"in B's def const\n";};
        B(int i) : A(i) {cout<<"in B const\n";}
        };

class C :   public B {
public:
        C() {cout<<"in C def cstr\n";}
        C(int i) : B(i) {cout<<"in C const\n";}
        };

int main()
{
        C c(2);
        return 0;
}

Вывод в этом случае

in A's def const
in B const
in C const

Почему это не входит в в A const

`Он должен следовать порядку вызова конструктора 1 arg. Но что на самом деле происходит при получении B из A с использованием виртуального ключевого слова.

Есть еще несколько вопросов

Даже если я удалю ключевое слово virtual в приведенной выше программе и удалю все конструкторы по умолчанию, это даст ошибку. Итак, зачем ему нужен конструктор def

22
задан Ciro Santilli 新疆改造中心法轮功六四事件 7 December 2016 в 19:29
поделиться