2009-06-08 19 views
5

tengo una clase abstracta con un par de funciones virtuales puras, y una de las clases que se derivan de ella no utiliza una de las funciones virtuales puras:¿Hay alguna manera de "eliminar" una función virtual pura?

class derivative: public base 
{ 
public: 
    int somevariable; 
    void somefunction(); 
}; 

de todos modos, cuando intento compilar, lo Obtiene un error (aparentemente, una clase todavía se considera abstracta si se deriva de una clase abstracta y no anula todas las funciones virtuales puras). De todos modos, parece inútil definir una función

int purevirtfunc(){return 0;} 

simplemente porque tiene que definirse por un tecnicismo. ¿Hay alguna forma de derivar una clase de una clase abstracta y no usar una de las funciones virtuales puras de la clase abstracta?

+6

Si hubiera alguna manera, ¿qué esperarías que ocurriera si el código llama a uno de esos métodos no implementados? – Aardvark

Respuesta

40

Si su clase derivada no "usa" la clase base de la función virtual pura, entonces la clase derivada no debe derivarse de la base, o el PVF no debería estar allí. En cualquier caso, su diseño tiene la culpa y necesita ser repensado.

Y no, no hay forma de borrar un archivo PVF.

1

Cuando hereda de una clase que tiene funciones virtuales puras, DEBE implementar esas funciones. Si no lo hace, entonces su clase derivada también es abstracta, y no puede crear un objeto de la clase derivada.

+0

También puede crear una implementación nula de la que herede la que se desactiva si hereda de esta interfaz con frecuencia. –

9

El propósito de derivar de las clases abstractas es que el código externo puede usar la clase abstracta y esperar que todas las funciones se hayan implementado correctamente. Ser capaz de implementar un método frustraría este propósito, haciendo que el código no sea accesible. Sin embargo, puedes lanzar una excepción, si así lo eliges.

1

No. Proporcionan una implementación predeterminada en la clase base o una implementación simple en la clase derivada, como sugirió.

14

Una clase virtual pura es una interfaz, que se espera que su código se cumpla. ¿Qué pasaría si implementara esa interfaz y no implementara uno de los métodos? ¿Cómo sabría el código que llama a su interfaz que no implementó el método?

Las opciones son:

  1. implementar el método que usted describe (lo que es privado indicaría que no se debe utilizar).
  2. Cambia la jerarquía de clases para tener en cuenta el cambio de diseño.
5

No es un tecnicismo en absoluto. Si su clase derivada no exhibe todo el comportamiento del padre, no debe derivarse del padre. Este es un olor de diseño importante, y es probable que necesite alguna refactorización de diseño.

0

Permitir esto no tendría ningún sentido. ¿Qué pasaría si llamaras a la función sin una implementación? Un error de tiempo de ejecución (eso sería una tontería)? Se podría argumentar que podría generar un error de compilación en algunos casos, pero esto no es posible si no se conoce el tipo exacto (por ejemplo, se pasa un puntero a una instancia de la clase derivada a una función).

0

Como mucha gente ya ha mencionado, parece que el método base no debe ser puramente virtual o debería reconsiderar si su clase derivada realmente es base de ISA.

Sin embargo, es posible proporcionar una implementación para el método virtual puro en la clase base. Esto puede actuar como una implementación predeterminada para las clases derivadas, pero todavía necesita que la clase derivada elija la explicidad de implementación de la clase base.

No sé si eso te ayudará con tu problema o no.

-1

No podría usted acaba de hacer

class Foo { 
public: 
    virtual void foo() = 0; 
}; 

class Bar { 
public: 
    virtual void foo() = delete; 
}; 
0

No, no lo hay. La convención en lenguajes enlazados tardíos cuando ocurre esta situación (como legítimamente podría ocurrir, pero considere su diseño para ver si este método puede trasladarse a otra parte, quizás a su clase abstracta), es presentar una excepción y asegurarse de que los usuarios de esa método sabe que algunas implementaciones pueden plantear esa excepción.

Cuestiones relacionadas