2010-06-19 10 views
5
class Base { 
    public: 
    Base() {} 

    void Foo(int x) {...} 
}; 

class Derived : public Base { 
    public: 
    Derived(int args) { 
     /* process args in some way */ 

     Foo(result); 
    } 
}; 

Est-il autorisé à appeler une méthode de la classe de base dans le constructeur de la classe dérivée? J'imagine que c'est bien car l'objet Base devrait être entièrement construit, mais je voulais vérifier au cas où.Méthode de classe de base d'appel du constructeur dérivé

Répondre

11

Est-il autorisé à appeler une méthode de la classe de base dans le constructeur de la classe dérivée?

Oui. Juste attention aux fonctions virtual. Si une classe dérivée de Derived substitue une fonction virtuelle, tout en construisant Derived en tant que sous-objet de cette classe dérivée supplémentaire, le type dynamique est toujours Derived, donc aucune fonction virtuelle ignorée dans d'autres classes dérivées n'est appelée. (Il en va de même pour le destructeur, BTW.)

J'imagine que c'est bien car l'objet Base devrait être entièrement construit, mais je voulais vérifier au cas où.

Votre raisonnement est juste.

1

Il y a un danger lorsque: 1.
la méthode est surchargée
2. la méthode appelle d'autres méthodes qui sont surchargées

+2

C'est simplement faux. Il n'y a certainement aucun problème avec les fonctions surchargées et les constructeurs. Voulez-vous dire _overridden_? (Et si oui, n'oubliez pas que cela s'applique uniquement aux fonctions virtuelles.) – sbi

+0

upvoted (et la réponse de sbi aussi), mais vous voulez dire 'overridden', pas 'surchargé' – tpdi

+0

sbi, dans la défense d'adf88, overridden implique virtual (as sinon c'est caché, pas écrasé, et probablement une erreur). – tpdi