2012-01-13 11 views
6

Tengo una clase existente que declara un método virtual y define una implementación predeterminada. Ahora quiero sobrecargar ese método con un parámetro diferente y también dar una implementación predeterminada. Además, quiero hacer cumplir la restricción, que si el primer método fue anulado por una subclase , entonces el segundo (sobrecargado) método virtual debe ser anulado también.¿Es posible determinar/afirmar que si una función virtual queda anulada, otra también se reemplaza?

¿Esto es posible incluso dentro de C++? Si es así, ¿es posible en tiempo de compilación?

código Ejemplo:

class ParamA {}; 
class ParamB {}; 

class Base 
{ 
public: 
    virtual void method(ParamA a) 
    { 
     // default behavior 
    } 
    virtual void method(ParamB b) 
    { 
     // default behavior 
    } 
} 

class Derived : public Base 
{ 
public: 
    virutal void method(ParamA) 
    { 
     // special behavior 
    } 
} 

Mi objetivo es detectar las clases de tipo Derived y hacerlas cumplir para implementar su verison de method(ParamB b).

+1

Puede hacer ambos virtuales en la clase base pura virtual ... –

+0

Lamentablemente, esa no es una opción ... –

+1

@js_: ¿Por qué no es una opción? Se trata de la única forma de (casi) hacer cumplir las reglas que desea. –

Respuesta

5

No, no puede especificar restricciones complejas sobre qué conjuntos de funciones de miembro deben anularse. Las únicas restricciones se aplican a funciones individuales; pura virtual (=0) para ordenar anulación, y (en C++ 11) final para evitar anulación.

Lo mejor que puede hacer es hacer ambas funciones puramente virtuales, forzando a la clase derivada a anular ambas. Esto al menos obliga al autor de la clase derivada a pensar sobre lo que debe prevalecer; es imposible anular uno y olvidarse del otro.

Aún puede proporcionar una implementación predeterminada, de modo que las clases derivadas que no desean sobrescribir ninguna de las funciones necesitan anulaciones muy cortas que invocan las versiones predeterminadas.

0

¿Qué le parece crear una clase para padres de la cual Base heredará? Estas 2 funciones serán puramente virtuales en la clase de Padres. Las clases derivadas heredarán Parent (y no Base) y tendrán que implementar ambas funciones.

1

Creo que C++ no proporciona ningún medio para detectar la anulación faltante en un niño.

@larsmans: Al hacer que ambos métodos sean virtuales puros, se pierde la implementación predeterminada.

@js_: ¿podría explicar un poco sobre su problema real? Lo que estás buscando parece ser conceptualmente no tan claro para mí.

+0

La sintaxis '@' solo funciona en comentarios, no en respuestas. Las respuestas están destinadas a responder la pregunta * solo *, no proporcionar comentario o hacer preguntas. –

+0

Puede proporcionar una implementación predeterminada de una función virtual pura. Las clases derivadas deben anularlo, pero son libres de llamar a la versión predeterminada si ese es el comportamiento deseado. –

+0

Cody Gray: Mi respuesta (al menos una parte de la respuesta) fue que C++ no proporciona ese mecanismo. Mike: los virtuales puros no tienen cuerpo, ¿o me estoy perdiendo algo que mencionaste? – boto

0

Si todo lo que tiene que trabajar es la clase principal, entonces no. No es posible ni en tiempo de compilación, ni como un control de tiempo de ejecución.

Por supuesto, podría presentar algunas macros (como por ejemplo, OVERRIDE_METHODS ... estoy seguro de que ve de lo que estoy hablando), pero nada puede evitar que los usuarios las ignoren y anule solo uno de dichos métodos.

Además, tales macros harán que el código sea bastante feo.

Cuestiones relacionadas