Последовательность вызовов конструктора в множественном наследовании
Я пытался найти много, чтоЧто делать, если только один класс становится виртуальным в множественном наследовании? Поведение вызова конструктора в этом случае мне не понятно. Скажем для примера
#include<iostream>
using namespace std;
class grand{
public:
grand(){cout<<"grandfather"<<endl;}
};
class parent1:virtual public grand{ //virtual used only here
public:
parent1(){cout<<"parent1 "<<endl;}
};
class parent2: public grand{
public:
parent2(){cout<<"parent2"<<endl;}
};
class child:public parent1,public parent2{
public:
child(){cout<<"child"<<endl;}
};
int main() {
child s;
return 0;
}
Выход этого кода выглядит как
grandfather
parent1
grandfather
parent2
child
но в приведенном выше коде, если мы изменим это
class parent1:virtual public grand{
public:
parent1(){cout<<"parent1 "<<endl;}
};
class parent2: public grand{
public:
parent2(){cout<<"parent2"<<endl;}
};
к этому
class parent1:public grand{ //virtual removed from here
public:
parent1(){cout<<"parent1 "<<endl;}
};
class parent2:virtual public grand{ //virtual is added here
public:
parent2(){cout<<"parent2"<<endl;}
};
вывод отображается как
grandfather
grandfather //why parent1 constructor is not called here?
parent1
parent2
child
Меня беспокоит, почему конструктор parent1 не вызывается после дедушки?