modificadores modificador metodos metodo herencia ejemplos clases atributos acceso c++ c++11 final virtual-functions

c++ - modificador - ¿Tiene sentido agregar una palabra clave final a la función virtual en una clase que no tiene una clase base(no se deriva)?



static final java (3)

¡Sí! En el ejemplo que proporciona, la palabra clave final evita que las clases derivadas anulen 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 anular u ocultar causa un error de compilación.

Estoy leyendo un asombroso tutorial de 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 se f() .


Si no marca la función como virtual y final , la clase secundaria todavía puede implementar la función y ocultar la función de clase base.

Al hacer que la función sea virtual y final la clase secundaria no puede anular u ocultar la función.


Su intuición es correcta: hacer que una función sea virtual solo para limitarla 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 interrumpe el ocultamiento de funciones: 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 se debe hacer cuando decida limitarse en su modelo. Ya que no hay manera de realizar una llamada virtual real aquí, esencialmente tiene la desventaja y no tiene ningún beneficio.