Alguna vez se preguntó cómo se puede diseñar una clase en C ++ que no se pueda heredar. Los lenguajes de programación Java y C # tienen esta característica incorporada. Puedes usar final palabra clave en java, sellado en C # para hacer una clase no extensible.

A continuación se muestra un mecanismo mediante el cual podemos lograr el mismo comportamiento en C ++. Hace uso de constructor privado, herencia virtual y clase de amigo.

En el siguiente código, hacemos el Final clase no heredable. Cuando una clase Derivado intenta heredar de él, obtenemos un error de compilación.

Una clase extra MakeFinal (cuyo constructor predeterminado es privado) se utiliza para nuestro propósito. Constructor de Final puede llamar al constructor privado de MakeFinal como Final es amigo de MakeFinal .

Tenga en cuenta que MakeFinal también es una clase base virtual. La razón de esto es llamar al constructor de MakeFinal a través del constructor de Derivado, no Final (El constructor de una clase base virtual no es llamado por la clase que hereda de ella, en su lugar, el constructor es llamado por el constructor de la clase concreta).

   

#include<iostream>

using namespace std;

 

class Final; 

 

class MakeFinal

{

private:

    MakeFinal() { cout << "MakFinal constructor" << endl; }

friend class Final;

};

 

class Final : virtual MakeFinal

{

public:

    Final() { cout << "Final constructor" << endl; }

};

 

class Derived : public Final

{

public:

    Derived() { cout << "Derived constructor" << endl; }

};

 

int main(int argc, char *argv[])

{

    Derived d;

    return 0;

}

Producción: Error del compilador

  In constructor 'Derived::Derived()':
  error: 'MakeFinal::MakeFinal()' is private

En el ejemplo anterior, DerivadoEl constructor invoca directamente MakeFinal’s constructor, y el constructor de MakeFinal es privado, por lo tanto, obtenemos el error de compilación.

Puede crear el objeto de Final clase ya que es amiga clase de MakeFinal y tiene acceso a su constructor. Por ejemplo, el siguiente programa funciona bien.

   

#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;

}

Producción: Se compila y funciona bien

MakeFinal constructor
Final constructor

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 discutido anteriormente.

Deja una respuesta

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