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

Я пытался найти много, чтоЧто делать, если только один класс становится виртуальным в множественном наследовании? Поведение вызова конструктора в этом случае мне не понятно. Скажем для примера

#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 не вызывается после дедушки?

Ответы на вопрос(1)

Ваш ответ на вопрос