¿Tiene sentido agregar la palabra clave final a la función virtual en una clase que no tiene clase base (no se deriva)
Estoy leyendo un tutorial de awesome awesome C++11 y el autor proporciona este ejemplo mientras explica la palabra clave final
:
struct B {
virtual void f() const final; // do not override
virtual void g();
};
struct D : B {
void f() const; // error: D::f attempts to override final B::f
void g(); // OK
};
Entonces, ¿tiene sentido usar aquí la palabra clave final
? En mi opinión, puede evitar el uso de la palabra clave virtual aquí y evitar que f()
se anule.
3 answers
Si no marca la función como virtual
y final
entonces la clase hija todavía puede implementar la función y ocultar la función de clase base.
Al hacer la función virtual
y final
la clase hija no puede anular o ocultar la función.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 08:46:29
¡Sí! En el ejemplo que proporciona, la palabra clave final
evita que cualquier clase derivada anule f()
como usted dice correctamente. Si la función no es virtual, D:f()
puede ocultar la versión de la clase base de la función:
struct B {
void f() const; // do not override
virtual void g();
};
struct D : B {
void f() const; // OK!
void g(); // OK
};
Al hacer f()
una función virtual
y final
, cualquier intento de sobreescribir u ocultar causa un error de compilación.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 13:29:43
Su intuición es correcta: hacer una función virtual
solo para coronarla inmediatamente con final
no tiene ningún beneficio sobre una función no virtual. Este es solo un breve fragmento de muestra para demostrar la característica.
Además, como se describe en otras respuestas, esto realmente rompe el ocultamiento de funciones't nunca podrá tener una función f
con la misma lista de parámetros en D
o cualquiera de sus clases derivadas.
Esta es una compensación que debe hacerse cuando decida limitar f
en su modelo. Dado que no hay manera de realizar una llamada virtual real aquí, esencialmente tiene la desventaja y ningún beneficio.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 13:59:24