Maison >développement back-end >C++ >Pourquoi les fonctions virtuelles se comportent-elles de manière inattendue lors de l'initialisation d'un objet C ?

Pourquoi les fonctions virtuelles se comportent-elles de manière inattendue lors de l'initialisation d'un objet C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-11 13:22:16806parcourir

Why Do Virtual Functions Behave Unexpectedly During C   Object Initialization?

Comprendre l'héritage et l'initialisation d'objets en C pour l'accès aux fonctions virtuelles

En C, l'héritage permet la création de classes dérivées qui héritent de propriétés et de comportements des classes de base. Cependant, l'ordre d'initialisation des objets en C peut avoir un impact sur le comportement des fonctions virtuelles.

Question :

Lorsqu'un objet est construit en C avec une classe de base ayant un virtuel fonction, pourquoi cette fonction pourrait-elle se comporter de manière inattendue ?

Réponse :

Le concept clé ici est l'ordre d'initialisation des classes de base et dérivées. En C , les classes de base sont construites avant les classes dérivées.

Explication :

Dans l'exemple fourni :

  • La classe de base définit un fonction virtuelle value() qui renvoie 0 par défaut.
  • dérivé hérite de la base et remplace la fonction value() pour renvoyer 1.
  • Lorsque la dérivée est instanciée, elle construit d'abord la partie de base de l'objet.
  • Cependant, à ce stade, l'objet n'est pas encore une instance dérivée complète, comme le constructeur de la classe dérivée n'a pas encore été exécuté.
  • Par conséquent, lorsque le constructeur de base appelle value(), il invoque la version de base de la fonction plutôt que la version dérivée remplacée, ce qui entraîne un sortie de 0.

Pour corriger ce comportement :

Pour garantir que la fonction value() de la classe dérivée est appelée lors de la construction de l'objet, vous devez initialiser le classe de base explicitement avec l'adresse de l'instance de classe dérivée :

derived example;
base(&example).value()

En passant l'adresse de l'objet dérivé, vous demandez au constructeur de base d'appeler le fonction value() sur l'objet dérivé, "maturisant" efficacement l'objet dans sa forme dérivée complète.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn