Comportement inattendu des arguments par défaut dans les fonctions virtuelles : comprendre la cause profonde
Dans cet extrait de code, vous rencontrez un problème intrigant lié à la valeur par défaut arguments des fonctions virtuelles. Bien que vous vous attendiez à ce que le résultat soit « D--data=20 », vous observez plutôt « D--data=10 ». Examinons le mécanisme interne pour comprendre la cause première.
Dans votre exemple, vous avez deux classes, B et D, avec une fonction virtuelle nommée print qui prend un argument par défaut. Dans la classe D, vous remplacez la fonction d'impression et fournissez un argument par défaut différent. Lorsque vous créez une instance de D, vous accédez à la fonction print via un pointeur vers B.
Selon le standard C (8.3.6.10), "Un appel de fonction virtuelle utilise les arguments par défaut dans la déclaration du fonction virtuelle déterminée par le type statique du pointeur ou de la référence désignant l'objet." Cela implique que lors de l'appel d'une fonction virtuelle via un pointeur vers une classe de base, elle utilise les arguments par défaut définis dans la déclaration de la classe de base, quels que soient les arguments par défaut remplacés dans la classe dérivée.
Par conséquent, lorsque vous appelez print via le pointeur bp, l'argument par défaut est déterminé par le type statique de bp, qui est B. Par conséquent, l'argument par défaut de B::print est utilisé, ce qui entraîne la sortie de "D--data=10" au lieu de l'attendu "D--données=20."
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!