J'ai une question sur l'initialisation des membres hérités dans le constructeur de la classe dérivée. Exemple de code:C++: Initialisation du champ hérité
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Ce code me donne le résultat suivant:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(voir http://codepad.org/tn1weFFP)
Je devine pourquoi cela se produit? m_int
doit être membre de B
, et la classe parente A
doit déjà être initialisée lorsque l'initialisation de m_int
dans B
se produit (car les constructeurs parents s'exécutent avant l'initialisation de membre de la classe héritée). Où est une erreur dans mon raisonnement? Que se passe-t-il vraiment dans ce code?
EDIT
: Je suis conscient d'autres possibilités pour initialiser ce membre (constructeur de base ou affectation dans le constructeur dérivé), mais je veux comprendre pourquoi est-ce illégal dans la façon dont je l'essaie? Une fonctionnalité spécifique du langage C++ ou autre? S'il vous plaît pointez-moi vers un paragraphe en C++ standard si possible.
C'est une bonne réponse, mais je voudrais juste ajouter quelques explications. Lorsque vous utilisez l'opérateur:, vous dites au compilateur qu'avant de faire quoi que ce soit d'autre, il doit exécuter ces instructions. Fondamentalement, vous définissez une variable avant l'exécution du constructeur parent (ou de tout autre élément). Par conséquent, la variable n'existe pas. : A(), m_int (0) devrait aussi fonctionner.Par défaut, si vous n'utilisez pas:, le compilateur exécutera le constructeur des classes de base. En d'autres termes, si vous ne faites rien C++ fera des choses par défaut pour vous, si vous commencez à spécifier des choses, cela suppose que vous sachiez ce que vous faites. –
Hmmm ... Autant que je sache, le constructeur de la classe parent est toujours exécuté avant toute autre initialisation, et donc la variable 'm_int' existe déjà lorsque j'essaie de l'initialiser. Donc ça ne devrait pas être le problème ... – Haspemulator
@Haspemulator Oui, ça existe déjà mais c'est pour ça que tu as l'erreur. Il a déjà été initialisé par défaut par le constructeur de A. Vous ne pouvez pas réinitialiser une variable dans le constructeur de B. Vous pouvez réaffecter comme l'indique Ben Jackson ci-dessus ('m_int = 0') et c'est à peu près tout. – wheaties