¿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.

Author: Toby Speight, 2017-05-24

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.

 32
Author: Some programmer dude,
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.

 11
Author: Karl Nicoll,
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.

 2
Author: Quentin,
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