Dans cet exemple,
F1() est redéfinie statiquement par
B, c'est à dire que le compilateur utilise le type officiel de la variable pour
savoir quelle fonction appeler. Ainsi, si on appelle
F1() depuis un objet de type
A, ce sera toujours
A::F1() qui sera appelé, et si l'objet est de type
B ce sera
B::F1() indépendamment du fait qu'il peut s'agir d'un pointeur ou d'une référence sur
A qui désigne en réalité un objet de type
B (cas d'utilisation polymorphique de
B).
L'appel à une fonction membre virtuelle n'est au contraire pas déterminé à la compilation mais lors de l'exécution. Le fait que
A::F2() soit déclarée
virtual et supplantée par
B::F2() signifie qu'à chaque appel de
F2() le compilateur va tester le type réel de l'objet afin d'appeler
B::F2() s'il le peut. Sinon il appellera
A::F2(). On parle alors de liaison dynamique (
dynamic binding en anglais) par opposition à la liaison statique faite lors de l'édition de liens.
La virtualité implique l'utilisation de pointeurs ou de références. Ceci est illustré par le 3° exemple du code ci-dessus qui effectue une recopie non polymorphique d'un objet
B vers un objet
A. Dans ce cas l'objet
B est "tronqué" (pour éviter ce problème il faut passer par une copie polymorphique, voir
Comment effectuer la copie d'objets polymorphiques ?) et on obtient un objet de type
A malgré que l'on soit parti d'un objet de type
B.
Ce n'est pas le cas avec l'utilisation de pointeurs ou références, qui bien que déclarés comme étant des pointeurs / références sur des objets de types
A peuvent désigner des objets de type
B comme dans les deux derniers exemples du code précédent.
Le type statique de
pa est
A* mais son type dynamique est
B*. De même, le type dynamique de
ra est
B, ce qui explique que
pa->F2() et
ra.F2() provoquent l'appel de
B::F2() alors que statiquement c'est
A::F2() qui aurait du être appelé.
Notez que cet exemple n'inclut pas de destructeur virtuel par souci de simplification, mais ceci serait nécessaire. Pour plus d'explications, lire la question
Pourquoi et quand faut-il créer un destructeur virtuel ?.