Réponse rapide: Les constructeurs sont spéciaux. Lorsque le constructeur de A est toujours en cours d'exécution, alors l'objet en construction n'est pas encore réellement de type A. Il est toujours en cours de construction. Lorsque le constructeur se termine, c'est maintenant un A.
Il en est de même pour le dérivé B. Le constructeur de A s'exécute en premier. Maintenant, c'est un A. Ensuite, le constructeur de B commence à fonctionner. Pendant ce temps, l'objet est toujours réellement un A. Seulement quand le constructeur de B finit il devient un B.
Vous pouvez le vérifier en essayant d'appeler la fonction virtuelle pure à partir des constructeurs. Si la fonction est définie dans A et que le constructeur de B l'appelle, il y aura une erreur d'exécution au lieu d'exécuter le remplacement de B, car l'objet n'est pas encore de type B.
Le compilateur ne vous permettra pas de générer du code qui construira un A, en raison de la fonction virtuelle pure. Mais il va générer du code pour construire un A dans le cadre du processus de construction d'un B. Il n'y a pas de magie impliquée dans cela. La règle selon laquelle vous ne pouvez pas construire un A est imposée par les règles de langage, pas par la physique. La langue soulève cette règle dans le cas particulier de la construction d'objets de B.
Après avoir essayé d'appeler la méthode virtuelle depuis le constructeur et avoir vu le résultat, rappelez-vous toujours de ne pas appeler les méthodes virtuelles dans les constructeurs :) –
Puis oubliez cette règle dans C++/CLI où elle ne s'applique pas! –