2009-12-15 24 views
6

Si obtengo una clase de otra y sobrescribo una función, puedo llamar a la función base llamando al Base::myFunction() dentro de la implementación de myFunc en la clase derivada.Clase derivada de fuerza para llamar a la función base

Sin embargo, ¿hay alguna manera de definir en mi clase Base que la función base se llame en cualquier caso, también sin que se llame explícitamente en la función sobrescrita? (Ya sea antes o después de la función derivada ejecutado)

O mejor aún, si tengo una función virtual en mi virtual de clase Base, y dos funciones privadas implementadas before() y after(), es posible definir en la clase Base que antes de y después de llamar a la función en cualquier clase derivada de esta clase Base, se llamará a before() y after()?

Gracias!

+4

¿En qué idioma está esto? –

+2

Probablemente C++ ('Base :: myFunction' parece C++) –

+0

No puedo evitar pensar que esto requiere una programación orientada a aspectos, aunque lamentablemente las implementaciones aún faltan. –

Respuesta

21

No, esto no es posible.
Pero se puede simular mediante una llamada a una función virtual diferente modo:

class Base 
{ 
public: 
    void myFunc() 
    { 
    before(); 
    doMyFunc(); 
    after(); 
    } 

    virtual void doMyFunc() = 0; 
}; 
+0

+1, estaba a punto de publicar esa sugerencia. – Roddy

+8

Si hace que la función virtual esté protegida (o incluso privada), deshabilitará que otros códigos invoquen el método virtual directamente a través de una referencia a base (no si tienen una referencia a un tipo derivado, ya que la clase derivada puede hacer públicamente el método disponible) –

+0

¡Esto sirve para mis necesidades! gracias :) – Mat

0

Está intentando evitar que una clase derivada sobrecargue/anule un método en la base. Puede alentarlo marcando los métodos como "no reemplazables" (dependiendo del idioma), pero siempre hay una forma de evitarlo.

En otras palabras, no puede forzar a alguien a usar su clase de una manera particular, solo dígales cómo debe usarse.

+1

no - quiero que se sobrescriba el método, pero quiero que se invoque la función base antes de la implementación en la clase derivada – Mat

+0

. Me salió un voto negativo * 3 * años después sin ningún comentario. – hometoast

0

Respondiendo para C++, no se puede tener una función heredada "invisible" denominado en la forma que desee.

Los únicos métodos que llaman a través de clases heredadas son constructores y destructores.

Cuestiones relacionadas