Voici quelques Code C ++:
mother mother daughter
5 Réponses :
Deux solutions: P>
ne dérive pas Vous ne voulez probablement pas n code> de m code>. Vérifiez que vous avez vraiment une réutilisation d'interface (que vous comptez sur une interface polymorphe) au lieu de la réutilisation de la mise en œuvre. Dans ce dernier cas, préférez faire un membre M * code> un membre de n code>, puis créer uniquement l'objet m code> si nécessaire. Ce serait ma solution préférée. P> li>
m code> s appellé à être appelé car il fait quelque chose que vous ne voulez pas. Déplacez ce code que vous ne voulez pas exécuter du constructeur M code> S dans un init () dédié () code> fonction ou similaire, puis appelez-le au besoin. Je ne le recommande pas parce que vous vous retrouvez avec une interface sottise. P> LI>
ol>
class m
{
protected:
m(bool init) { if(init) Init(); }
Init() { cout << "mother" << endl; }
public:
m() { Init(); }
};
class n : m
{
public:
n() : m(false) { cout << "daughter" << endl; }
};
afaik, vous ne pouvez pas supprimer le constructeur hérité.
Le problème dans votre exemple provient d'une conception de classe incorrecte. Le constructeur est normalement utilisé pour allouer des ressources de classe, définir des valeurs par défaut, etc. Il n'est pas parfaitement approprié d'être utilisé pour délivrer quelque chose. P>
vous devez mettre p> dans la fonction virtuelle. P> en général - Si vous avez besoin de supprimer le constructeur hérité, vous devez probablement repenser / repenser votre hiérarchie de classe. p> p>
+1 Mais pour éviter d'être égarés, il faut peut-être souligner que les CTORS ne doivent pas appeler des fonctions virtuelles.
Méfiez-vous que le type dynamique de l'objet change alors que l'objet est en cours de construction. Si vous apportez l'appel à la méthode virtuelle dans le constructeur de base, la sortie sera toujours «base» comme lorsque ce constructeur est exécuté l'objet est B> une "base"
@ STINKY472: En C ++, Contrairement à Java, il est prudent d'appeler une méthode virtuelle dans le constructeur (ou destructeur) tant que vous savez que, à ce stade, les commandes de classes ne seront pas considérées. Ce n'est que si la méthode est pure virtuelle à ce niveau, il s'agit d'un comportement indéfini l'appelant du constructeur / destructeur. En Java, dans d'autre part, vous ne devez pas i> appeler toute méthode de remplacement du constructeur, comme cela sera expédié à la classe la plus dérivée qui n'a pas encore été initialisée.
Les constructeurs ne sont jamais hérités. Ce qui se passe, c'est que C ++ génère un constructeur nullaire par défaut qui initialise les classes de base et les membres du type de classe. Les classes de base sont toujours initialisées et il n'ya aucun moyen de l'empêcher, donc si vous ne voulez pas que les constructeurs de classe de base soient appelés, n'héritez pas de la classe de base. P>
objet de n'importe quelle classe contient sous des sous-objets de toutes ses superclasses. Et tous