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!