Maison >développement back-end >C++ >Pourquoi le constructeur par défaut de la classe Grand-mère est-il appelé dans l'héritage virtuel ?

Pourquoi le constructeur par défaut de la classe Grand-mère est-il appelé dans l'héritage virtuel ?

DDD
DDDoriginal
2024-11-16 22:22:03941parcourir

Why is the Grandmother Class's Default Constructor Called in Virtual Inheritance?

Pourquoi le constructeur par défaut est-il appelé dans l'héritage virtuel ?

Lors de la création d'un nouvel objet d'une classe fille à l'aide de l'héritage virtuel, le constructeur par défaut de la classe grand-mère est invoquée de manière inattendue. Ce comportement peut paraître contre-intuitif, sachant que l'utilisateur appelle explicitement le constructeur de la classe mère avec un argument.

Explication :

En héritage virtuel, le constructeur de la base virtuelle La classe est invoquée directement par le constructeur de la classe la plus dérivée. Dans le code donné, la classe fille est la classe la plus dérivée et, par conséquent, elle appelle directement le constructeur grand-mère.

Étant donné que la classe fille ne fournit aucun argument au constructeur grand-mère dans la liste d'initialisation, la valeur par défaut Le constructeur de la classe grand-mère est automatiquement appelé. En effet, par défaut, le compilateur suppose que le constructeur par défaut doit être utilisé lorsqu'aucun constructeur spécifique n'est invoqué.

Solution :

Pour appeler le constructeur grand-mère souhaité avec un argument, la liste d'initialisation du constructeur de la classe fille doit être explicitement mise à jour. Le code correct est :

daughter(int attr) : grandmother(attr), mother(attr) { ... }

Cela garantit que le constructeur grand-mère est appelé avec l'argument spécifié. Alternativement, la classe grand-mère peut fournir un constructeur par défaut qui accepte un argument.

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