2010-07-02 15 views
21

Esto probablemente se haya preguntado antes en SO, pero no he podido encontrar una pregunta similar.¿Debo especificar también virtual en los métodos de subclases?

Considere la siguiente jerarquía de clases:

class BritneySpears 
{ 
    public: 

    virtual ~BritneySpears(); 
}; 

class Daughter1 : public BritneySpears 
{ 
    public: 

    virtual ~Daughter1(); // Virtual specifier 
}; 

class Daughter2 : public BritneySpears 
{ 
    public: 

    ~Daughter2(); // No virtual specifier 
}; 

¿Hay una diferencia entre Daughter1 y Daughter2 clases?

¿Cuáles son las consecuencias de especificar/no especificar virtual en un destructor/método de subclase?

Gracias.

+2

Nota para los lectores: también eche un vistazo a la palabra clave ['override'] (http://stackoverflow.com/questions/13880205/override-in-c11) en C++ 11 que está estrechamente relacionada con ese tema. – ereOn

Respuesta

28

No, técnicamente, no necesita especificar virtual. Si el método base es virtual, C++ creará automáticamente el método de anulación coincidente virtual.

Sin embargo, debería marcarlos virtual. El método es virtual después de todo y hace que su código sea mucho más claro y más fácil de seguir por otros desarrolladores.

+0

Muchas buenas respuestas aquí. Escogí el más popular :) Gracias a todos ustedes. – ereOn

6

Virtual se recoge automáticamente en anulaciones de métodos derivados independientemente de si lo especifica en la clase secundaria.

La consecuencia principal es que sin especificar virtual en el elemento secundario es más difícil ver desde la definición de clase secundaria que el método es de hecho virtual. Por esta razón, siempre especifico virtual en las clases padre e hijo.

8

You do not need it, pero si lo marca, puede hacer que su código sea más claro.

Nota: si la clase base tiene un destructor virtual, entonces su destructor es automáticamente virtual. Es posible que necesite un destructor explícito para otros motivos , pero no es necesario redeclarar un destructor simplemente para hacer que sea virtual. No importa si lo declara con la palabra clave virtual , lo declara sin la palabra clave virtual , o no lo declara en absoluto, sigue siendo virtual.

Cuestiones relacionadas