This is the code:
struct Biology
{    
    Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : Biology
{    
    Human() { cout << "Human CTOR" << endl; }
};
struct Animal : virtual Biology
{
    Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
    Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{   
   Centaur c;
   return 0;
}
This code prints:
Biology CTOR
Biology CTOR
Human CTOR
Animal CTOR
Centaur CTOR
Why?
Since we create a Centaur object, we start from building the Centaur by constructing Human, Animal and finally Centaur (we start from the less derived to the most derived).
Let's start from Human:
Human inherits from Biology, so we call Biology's constructor first.
Now that Human's base class is constructed, we can finally construct the Human itself.
But instead, Biology gets constructed again!
Why? What's happening behind the scenes?
Please note that it was completely intentional leaving Animal inheriting virtually from Biology and, at the same time, it was also intentional leaving Human non-virtually inheriting from Biology.
We are solving the Dreaded Diamond in an incorrect way: both Human and Animal should virtually inherit Biology to make this work.
I'm just curious.
Also, see this code:
struct Biology
{    
    Biology() { cout << "Biology CTOR" << endl; }
};
struct Human : virtual Biology
{
    Human() { cout << "Human CTOR" << endl; }
};
struct Animal : Biology
{    
    Animal() { cout << "Animal CTOR" << endl; }
};
struct Centaur : Human, Animal
{
    Centaur() { cout << "Centaur CTOR" << endl; }
};
int main()
{   
   Centaur c;
   return 0;
}
Here we have Human inheriting virtually from Biology, while Animal is set to inherit in the "classic way".
But this time, the output is different:
Biology CTOR
Human CTOR
Biology CTOR
Animal CTOR
Centaur CTOR
This because Centaur inherits at first from Human and then from Animal.
Had the order been the inverse, we'd have achieved the same result as before, in the first example - two Biology instances being constructed in a row.
What's the logic of this?
Please try to explain your way, I've already checked tons of websites speaking about this. But none seems to satisfy my request.
 
     
     
    