8
votes

Remplacer ou supprimer un constructeur hérité

Voici quelques Code C ++:

mother  
mother  
daughter


0 commentaires

5 Réponses :


0
votes

Deux solutions:

  1. ne dérive pas n de m . 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 * un membre de n , puis créer uniquement l'objet m si nécessaire. Ce serait ma solution préférée.

  2. Vous ne voulez probablement pas m 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 S dans un init () dédié () fonction ou similaire, puis appelez-le au besoin. Je ne le recommande pas parce que vous vous retrouvez avec une interface sottise.


0 commentaires

2
votes
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; }
};

0 commentaires

14
votes

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.

vous devez mettre xxx

dans la fonction virtuelle.

en général - Si vous avez besoin de supprimer le constructeur hérité, vous devez probablement repenser / repenser votre hiérarchie de classe.


3 commentaires

+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 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 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.



0
votes

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.


0 commentaires

0
votes

objet de n'importe quelle classe contient sous des sous-objets de toutes ses superclasses. Et tous doivent être construits avant la construction de l'objet principal. Une partie de cette construction appelle l'un des constructeurs de classe de base et il ne peut pas être omis. Vous ne pouvez choisir que le constructeur d'être appelé.


0 commentaires