Vous pouvez utiliser la partie B1
de this
car elle est déjà initialisée. §12.6.2/5: "les classes de base directes doivent être initialisées dans l'ordre de la déclaration telles qu'elles apparaissent dans la liste de spécification de base (indépendamment de l'ordre des initialiseurs)."
La liste de spécification de base est class D : public B1, public B2
et la liste mem-initializer est D::D() : B1(), B2(…)
. Je dirais que cela a «l'odeur du code», cependant.
EDIT: Maintenant, je comprends votre préoccupation, si this
n'est pas défini à l'extérieur du corps du constructeur, qui ne comprend pas les initialiseurs membres. Le langage permettant cela est enterré entre deux exemples et je l'ai manqué au début. Paragraphe 7: "Les noms dans la liste d'expression d'un mem-initialiseur sont évalués dans la portée du constructeur pour lequel le mem-initializer est spécifié."
Si B2
a réellement besoin de conserver un pointeur sur un B1
, et ce pointeur pointe toujours à l'intérieur de l'objet le plus dérivé, pensez héritage virtuel.
class B1 {};
class B2 : virtual B1 {}; // under the hood, B2 has a pointer to B1.
class D : public virtual B1, public B2 {}; // D has a pointer too
// Only the most-derived class (the one actually used for instantiation)
// implements space for and initialization of the B1.
Dans mon cas, B1 et B2 ne sont pas dans une relation d'héritage, je ne veux pas changer B2 dans le but de résoudre ce problème. –