91 votos

¿Por qué necesitamos un destructor virtual puro en C ?

Entiendo la necesidad de un destructor virtual. Pero ¿por qué necesitamos un destructor virtual puro? En uno de los artículos de C++, el autor ha mencionado que utilizamos destructor virtual puro cuando queremos hacer una clase abstracta.

Pero podemos hacer una clase abstracta, haciendo cualquiera de las funciones miembro como virtual pura.

Así que mis preguntas son

  1. Cuando lo que realmente hacen un destructor virtual puro? ¿Alguien puede dar un buen de tiempo real ejemplo?

  2. Cuando estamos creando clases abstractas es una buena práctica hacer que el destructor también virtual pura? Si, sí..¿por qué?

65voto

Motti Puntos 32921
  1. Probablemente la verdadera razón por la que la pura destructores virtuales se permite es que prohibir ellos supondría añadir otra regla para el idioma y no hay necesidad de esta regla, ya que no hay malos efectos puede venir a partir de lo que un destructor virtual puro.

  2. Nope, el viejo y simple virtual es suficiente en la mayoría (todos?) de los casos.

Si se crea un objeto con valor predeterminado de las implementaciones de sus métodos virtuales y quiere hacer lo abstracto sin forzar a nadie para reemplazar cualquier específicas de método, usted puede hacer el destructor virtual puro. No le veo mucho sentido, pero es posible.

También se puede asumir que cada clase derivada probablemente necesitaría específica en el código de limpieza y el uso de la pura destructor virtual como un recordatorio a escribir uno, pero esto parece artificial.

Nota: El destructor es el único método que, incluso si es virtual pura ha de tener una aplicación para que la clase se define en ser útil (sí las funciones virtuales puras pueden tener implementaciones).

struct foo {
    virtual void bar() = 0;
};

void foo::bar() { /* default implementation */ }

class foof : public foo {
    void bar() { foo::bar(); } // have to explicitly call default implementation.
};

26voto

Braden Puntos 785

Todo lo que usted necesita para una clase abstracta es, al menos, una función virtual pura. Cualquier función de hacer; pero mientras eso sucede, el destructor es algo que cualquier clase, de modo que está siempre allí, como un candidato. Por otra parte, el destructor virtual puro (en oposición a sólo virtual) no tiene ningún comportamiento de efectos secundarios y otros para hacer que la clase sea abstract. Como tal, un montón de guías de estilo recomienda que el virtual pura destuctor ser usado de forma consistente para indicar que una clase es abstracta-si por ninguna otra razón que la que proporciona un lugar coherente a alguien leyendo el código puede mirar a ver si la clase es abstracta.

15voto

leander Puntos 6363

Si desea crear una clase base abstracta:

  • que no puede ser instanciado (sí, este es redundante con el término "abstracto"!)
  • pero las necesidades de destructor virtual de comportamiento (usted tiene la intención de llevar alrededor de punteros para la ABC, en lugar de punteros a los tipos derivados, y eliminar a través de ellos)
  • pero no se necesita ningún otro virtual de envío comportamiento de otros métodos (tal vez hay son no hay otros métodos? considere un simple protegida "recurso" contenedor que necesita un constructores/destructor/asignación, pero no mucho más)

...es más fácil hacer que la clase sea abstracta, haciendo que el destructor virtual puro y proveer una definición del método cuerpo).

Para que nuestro hipotético ABC:

Usted garantiza que no se pueden crear instancias (internos, incluso a la propia clase, es por eso que los constructores privados no puede ser suficiente), se obtiene la virtual comportamiento que usted quiere para el destructor, y usted no tiene que encontrar la etiqueta y el otro método que no necesita virtual de envío como "virtual".

3voto

sukumar Puntos 21

Si desea detener la creación de instancias de la clase base sin hacer ningún cambio en su clase deriva ya implementado y probado, se implementa un destructor virtual puro en su clase base.

0voto

Steven Sudit Puntos 13793

1) Cuando se quiere exigir a las clases derivadas de hacer limpieza. Esto es raro.

2) No, pero usted quiere que sea virtual, sin embargo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X