Pregunta

Mientras rastreaba un código antiguo me encontré con algo similar a lo siguiente:

class Base
{
public:
    virtual int Func();
    ...
};

class Derived : public Base
{
public:
    int Func(); // Missing 'virtual' qualifier
    ...
};

El código se compila bien (MS VS2008) sin advertencias (nivel 4) y funciona como se esperaba: Func es virtual a pesar de que falta el calificador virtual en la clase derivada. Ahora, además de causar cierta confusión, ¿hay algún peligro con este código o debería cambiarlo todo, agregando el calificador virtual ?

¿Fue útil?

Solución

El virtual se transferirá a todas las funciones primordiales en las clases derivadas. El único beneficio real de agregar la palabra clave es indicar su intención de que un observador casual de la definición de clase Derivada sepa de inmediato que Func es virtual.

Incluso las clases que extienden Derived tendrán métodos virtuales Func.

Referencia: Funciones virtuales en MSDN. Desplácese hacia abajo de la página para ver

  

La palabra clave virtual se puede usar cuando   declarando funciones primordiales en un   clase derivada, pero es innecesaria;   las anulaciones de funciones virtuales son   siempre virtual.

Otros consejos

Aquí hay una consecuencia interesante de no necesitar declarar funciones primordiales virtuales:

template <typename Base>
struct Derived : Base
{
    void f();
};

Si la derivada f será virtual depende de si Derived se instancia con una Base con una función virtual f de la firma correcta.

Alguien me dijo una vez que los compiladores de C ++ muy antiguos, que no se ajustan a las especificaciones, requieren que se configure virtual para todas las subclases. Eso ya no es un problema.

Un peligro de seguir esta práctica es que las personas pueden no darse cuenta de que necesitan la palabra clave virtual en funciones que están destinadas a ser virtuales. Es muy probable que se trate de personas que provienen de lenguajes donde no existe el concepto de funciones no virtuales (por ejemplo: Java, REALbasic). Como corolario, no se puede saber cuándo virtual se ha omitido deliberadamente porque se supone que una función no es virtual.

Sospecho que algunas herramientas de análisis de código también pueden no ser lo suficientemente inteligentes como para recoger la virtualidad heredada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top