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
Libérer: 2024-12-11 13:22:16
original
780 Les gens l'ont consulté

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()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal