2012-04-24 14 views
5

Duplicar posibles:
How to force child same virtual function call its parent virtual function firstCómo llamar a métodos anulado en todas las clases derivadas

Tengo una jerarquía de clases, donde cada clase derivada se impone a una función virtual dado y comienza su ejecución llamando el que está en su clase de padres. El objetivo es que cada una de las implementaciones derivadas se ejecute, pero no me gusta la forma en que lo hago.

Por ejemplo, tengo esta clase:

class base 
{ 
public: 
    void do_stuff() { do_something(); } 
    virtual void do_something() { } 
}; 

Entonces se derivan de esta clase en varios niveles:

class derived_10: 
    public derived_9 // which inherit from derived_8 and so on until derived_0 
        // which inherit from base 
{ 
public: 
    virtual void do_something() 
    { 
    // this will also call derived_8::do_something() and so on 
    // until base::do_something() 
    derived_9::do_something(); 

    // then, some stuff 
    } 
}; 

Busco una solución que se asegurará de que todos derived_x: : do_something() se invocará en secuencia cuando se llame a base :: do_stuff(), sin tener que esperar que las clases derivadas lo hagan ellos mismos. ¿Tiene una idea de la mejor manera de obtener este comportamiento?

+4

¿Por qué su jerarquía de herencia es tan profunda? – Cameron

+0

Lástima que esta pregunta se cerró como un duplicado. Estaba a punto de publicar una respuesta a esto. Este comentario tendrá que hacer. ¿Qué tal algo como [esto] (http://codepad.org/MtRoQ6Bg)? – greatwolf

+0

@cameron, la jerarquía describe objetos del juego como word_item <- renderable_item <- character <- monster <- jugable_character <- hero. No tiene una profundidad de 10 clases, pero sigue siendo bastante grande. – Julien

Respuesta

3

ya he hizo una pregunta muy similar antes: Calling overriden class methods as a chain in C++

La respuesta He aceptado señaló a su propia solución. Sin embargo, puedo darte una idea sobre una alternativa. Los constructores y destructores ya tienen este comportamiento en C++, es posible que desee considerar la reestructuración de su código, de modo que el trabajo se realice durante la construcción o la destrucción de un objeto que pertenece a una clase en una jerarquía. Sin embargo, no estoy seguro de que puedas hacer que esto valga la pena. Por otro lado, nunca se sabe lo que se puede obtener de una metaprogramación de plantillas + alguna magia preprocesadora.

Cuestiones relacionadas