Especificador final de C++

En Java, podemos usar final para una función para asegurarnos de que no se pueda anular. También podemos usar final en Java para asegurarnos de que una clase no se pueda heredar. Del mismo modo, el último estándar de C++ C++ 11 agregó final. 
Uso del especificador final en C++ 11: 
a veces no desea permitir que la clase derivada anule la función virtual de la clase base. C++ 11 permite una instalación integrada para evitar la anulación de la función virtual utilizando el especificador final. 

Considere el siguiente ejemplo que muestra el uso del especificador final. Este programa falla en la compilación. 

CPP

#include <iostream>
using namespace std;
 
class Base
{
public:
    virtual void myfun() final
    {
        cout << "myfun() in Base";
    }
};
class Derived : public Base
{
    void myfun()
    {
        cout << "myfun() in Derived\n";
    }
};
 
int main()
{
    Derived d;
    Base &b = d;
    b.myfun();
    return 0;
}

Producción: 

prog.cpp:14:10: error: virtual function ‘virtual void Derived::myfun()’
     void myfun()
          ^
prog.cpp:7:18: error: overriding final function ‘virtual void Base::myfun()’
     virtual void myfun() final 

Segundo uso del especificador 
final: el especificador final en C++ 11 también se puede usar para evitar la herencia de clase/estructura. Si una clase o estructura se marca como final, se vuelve no heredable y no se puede usar como clase/estructura base. 

El siguiente programa muestra el uso del especificador final para hacer que la clase no sea heredable: 

CPP

#include <iostream>
class Base final
{
};
 
class Derived : public Base
{
};
 
int main()
{
    Derived d;
    return 0;
}

Producción: 

error: cannot derive from ‘final’ base ‘Base’ in derived type ‘Derived’
 class Derived : public Base

final en C++ 11 vs en Java 
Tenga en cuenta que el uso del especificador final en C++ 11 es el mismo que en Java, pero Java usa final antes del nombre de la clase, mientras que el especificador final se usa después del nombre de la clase en C++ 11. De la misma manera que Java usa la palabra clave final en el comienzo de la definición del método (antes del tipo de retorno del método) pero C++ 11 usa el especificador final después del nombre de la función.
 

CPP

class Test
{
    final void fun()// use of final in Java
    { }
}
class Test
{
public:
    virtual void fun() final //use of final in C++ 11
    {}
};

A diferencia de Java, final no es una palabra clave en C++ 11. final tiene significado solo cuando se usa en los contextos anteriores; de lo contrario, es solo un identificador. 
Una posible razón para no hacer final una palabra clave es garantizar la compatibilidad con versiones anteriores. Puede haber códigos de producción que utilicen final para otros fines. Por ejemplo, el siguiente programa compila y se ejecuta sin errores. 
 

CPP

#include <iostream>
using namespace std;
 
int main()
{
    int final = 20;
    cout << final;
    return 0;
}

Producción: 

20

En java, final también se puede usar con variables para asegurarse de que un valor solo se pueda asignar una vez. este uso de final no existe en C++ 11.
Este artículo es una contribución de Meet Pravasi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *