Alguna vez se preguntó cómo puede diseñar una clase en C++ que no se puede heredar. Los lenguajes de programación Java y C# tienen esta característica incorporada. Puede usar la palabra clave final en Java, sellada en C# para hacer que una clase no sea extensible.
A continuación se muestra un mecanismo mediante el cual podemos lograr el mismo comportamiento en C++. Hace uso de un constructor privado, herencia virtual y clase amiga.
En el siguiente código, hacemos que la clase Final no sea heredable. Cuando una clase Derivada intenta heredar de ella, obtenemos un error de compilación. Se utiliza
una clase adicional MakeFinal (cuyo constructor predeterminado es privado) para nuestro propósito. El constructor de Final puede llamar al constructor privado de MakeFinal ya que Final es amigo de MakeFinal .
NOTA: MakeFinal también es una clase base virtual. El motivo de esto es llamar al constructor de MakeFinal a través del constructor de Derived , no Final (el constructor de una clase base virtual no es llamado por la clase que hereda de ella, sino que el constructor es llamado por el constructor de la clase concreta ).
Como en C++ 11 hay soporte para el especificador final , el tercer ejemplo muestra su implementación.
C++
// C++ program with compilation // error to demonstrate that // Final class cannot be inherited #include <iostream> using namespace std; // The class to be made final class Final; // used to make the Final class final class MakeFinal { private: MakeFinal() { cout << "MakFinal constructor" << endl; } friend class Final; }; class Final : virtual MakeFinal { public: Final() { cout << "Final constructor" << endl; } }; // Compiler error class Derived : public Final { public: Derived() { cout << "Derived constructor" << endl; } }; int main(int argc, char* argv[]) { Derived d; return 0; }
Producción
In constructor 'Derived::Derived()': error: 'MakeFinal::MakeFinal()' is private
En el ejemplo anterior, el constructor de Derived invoca directamente al constructor de MakeFinal y el constructor de MakeFinal es privado, por lo que obtenemos el error de compilación.
Puede crear el objeto de la clase Final ya que es una clase amiga de MakeFinal y tiene acceso a su constructor. Por ejemplo, el siguiente programa funciona bien.
C++
// C++ program without any // compilation error to demonstrate // that instances of the Final // class can be created #include <iostream> using namespace std; class Final; class MakeFinal { private: MakeFinal() { cout << "MakeFinal constructor" << endl; } friend class Final; }; class Final : virtual MakeFinal { public: Final() { cout << "Final constructor" << endl; } }; int main(int argc, char* argv[]) { Final f; return 0; }
MakeFinal constructor Final constructor
Actualización de C++ 11:
En C++ 11, podemos hacer que la clase base no sea heredable usando el especificador final . Por ejemplo, el siguiente código da un error de compilación ya que la clase base se declara como final.
C++
// C++ Program with compilation error // as the base class is declared as final #include <iostream> using namespace std; class Base final { // body }; // Compile error because base class is final class Derived : public Base { // body }; int main() { return 0; }
Producción
prog.cpp:8:7: error: cannot derive from ‘final’ base ‘base’ in derived type ‘derive’ class derive: public base // compile error because base class is final
Este artículo fue compilado por Gopal Gorthi y revisado por el equipo de GeeksforGeeks. 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