2010-06-19 26 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); 
    } 
}; 

¿Se permite llamar a un método de la clase base en el constructor de la clase derivada? Me imagino que esto está bien ya que el objeto Base debería estar completamente construido, pero quería comprobarlo por si acaso.Método de clase base de llamadas del constructor derivado

Respuesta

11

¿Está permitido llamar a un método de la clase base en el constructor de la clase derivada?

Sí. Solo ten cuidado con las funciones virtual. Si una clase derivada de Derived anula una función virtual, mientras construye Derived como un subobjeto de esa clase derivada adicional, el tipo dinámico siempre es Derived, por lo que no se invocan funciones virtuales anuladas en otras clases derivadas. (Lo mismo vale para el destructor, BTW.)

Me imagino que esto está bien ya que el objeto Base debería estar completamente construido, pero quería comprobarlo por si acaso.

Su razonamiento es correcto.

1

Existe el peligro cuando: 1.
el método se anula
2. el método llama a otros métodos que no prevalezca

+2

Eso es simplemente erróneo. Ciertamente no hay problema con las funciones y constructores sobrecargados. ¿Te refieres a _overridden_? (Y si es así, no olvide que esto solo se aplica a las funciones virtuales) – sbi

+0

upvoted (y la respuesta de sbi también), pero quiere decir 'invalidado', no 'sobrecargado' – tpdi

+0

sbi, en defensa de adf88, reemplazado implica virtual (como de lo contrario, está oculto, no anulado, y probablemente sea un error). – tpdi

Cuestiones relacionadas