Sont multiples, héritée de constructeurs appelé plusieurs fois?
Sont multiples, héritée de constructeurs appelé plusieurs fois? Et dans quel ordre sont les constructeurs appelé? Est-ce à dépendre de l'ordre dans la liste d'héritage?
Voici un exemple (c'est seulement pour rendre la situation claire, aucun exemple réel).
class Base {};
class DerivedBaseOne : public Base {};
class DerivedBaseTwo : public Base {};
class Derived : public DerivedBaseTwo, public DerivedBaseOne
{};
//somewhere in the code, is Base() called two times here?
Derived * foo = new Derived();
Est le Base()
constructeur appelé deux fois? Et dans quel ordre les constructeurs sont appelés? Base en premier? Ou DerivedBaseOne()
ou DerivedBaseTwo()
premier?
- Vous pouvez aussi penser à l'héritage virtuel que ce serait un peu différente de la normale à l'héritage.
- Héritée des constructeurs est une fonction de c++11 et dire complètement autre chose.
- Connexes: en.wikipedia.org/wiki/Diamond_problem
Vous devez vous connecter pour publier un commentaire.
La façon dont vous l'écrivez,
Derived
a deux distinct sous-objets de typeBase
, et chacun y va de sa propre constructeur appelé à partir de laDerivedBaseXXX
constructeur dont il est le sous-objet. L'ordre des appels suit l'ordre de déclaration.En revanche, de vous déclarer
DerivedBaseXXX : virtual public Base
, puis il ya seulement unBase
sous-objet, et de son constructeur est appelé à partir de la plupart des dérivés de l'objet, c'est à dire à partir de laDerived
objet.(Pour expliquer un peu plus en détail: Une (peut-être individuellement hériter) de la classe est construite en premier: 1) l'appel de la classe de base du constructeur, puis 2) appelant les constructeurs de tous les objets dans l'ordre de leur déclaration, et enfin, 3) l'exécution de la fonction de constructeur de corps. Cela s'applique de manière récursive, et pour l'héritage multiple, que vous venez de remplacer (1) en appelant de toute la base constructeurs de la classe, dans l'ordre de la succession a été déclarée. Seulement l'héritage virtuel ajoute une véritable couche supplémentaire de complication ici.)
L'ordre de constructeur appelle par votre hiérarchie d'héritage sera:
L'ordre est en effet bien défini et dépend de l'ordre dans lequel vous parler de la dérivation des classes de base, et l'ordre dans lequel vous déclarez les membres de la classe pour les membres. (Voir la référence de la Norme C++ ci-dessous.)
La Base() constructeur appelé deux fois?
OUI
La
Base()
constructeur de la classe est appelée, d'ici deux fois, parce que les deux classesDerivedBaseTwo()
etDerivedBaseOne()
en découlent, de sorte que le constructeur de classe de base est appelé une fois pour chacun d'eux. VotreDerived
classe a deux distinctsBase
sous-objets par le biais de chemins d'accès multiples (un parDerivedBaseOne()
et l'autre, bien queDerivedBaseTwo()
).La hiérarchie des classes que vous avez avec l'héritage multiple est inhabituel et qui mène à un problème appelé le En Forme De Diamant, De L'Héritage De Problème. Pour éviter ce problème C++ introduit le concept de Classe de base virtuelle.
Référence:
C++03 Standard: 12.6.2/5, l'Initialisation des bases et des membres
Base
classe dans ce cas, ne sera pas appelé deux fois, mais une seule fois. L'héritage virtuel, qui n'est pas réellement utilisé dans le code de la question, assure cette. Néanmoins, le code en question n'est pas compilable comme l'héritage virtuel n'est pas utilisé qui est nécessaire dans un cas de diamant de l'héritage de classe.b
utilise la valeur de membrea
en direct de l'initialiseur, sa déclaration doit réussir que dea
, etc.).Cette réponse: http://www.parashift.com/c++-faq-lite/multi-héritage.html#faq-25.14
Depuis plusieurs votre déclaration de succession listes
DerivedBaseTwo
tout d'abord, sa construction commande sera exécutée avantDerivedBaseOne
's.Dans votre
Derived
classe,DerivedBaseTwo
et sa chaîne est créé en premier, c'est:1 -
Base
puisDerivedBaseTwo
Et puis
DerivedBaseOne
et sa chaîne:2 -
Base
puisDerivedBaseOne
Et puis:
3 -
Derived
est créé après tout le reste.Aussi, avec l'héritage multiple, être conscient de la Diamant Héritage Problème