Hemos discutido un tema similar en Java aquí. A diferencia de Java, C ++ permite otorgar un acceso más restrictivo a los métodos de clases derivadas. Por ejemplo, el siguiente programa se compila bien.

#include<iostream>

using namespace std;

 

class Base {

public:

    virtual int fun(int i) { }

};

 

class Derived: public Base {

private:

    int fun(int x)   {  }

};

 

int main()

{  }

En el programa anterior, si cambiamos main () a siguiente, obtendremos un error del compilador porque fun () es privado en la clase derivada.

int main()

{

    Derived d;

    d.fun(1);

    return 0;

}

¿Qué pasa con el programa a continuación?

#include<iostream>

using namespace std;

 

class Base {

public:

    virtual int fun(int i) { cout << "Base::fun(int i) called"; }

};

 

class Derived: public Base {

private:

    int fun(int x)   { cout << "Derived::fun(int x) called"; }

};

 

int main()

{

    Base *ptr = new Derived;

    ptr->fun(10);

    return 0;

}

Producción:

 Derived::fun(int x) called 

En el programa anterior, la función privada “Derived :: fun (int)” se llama a través de un puntero de clase base, el programa funciona bien porque fun () es público en la clase base. Los especificadores de acceso se comprueban en tiempo de compilación y fun () es público en la clase base. En tiempo de ejecución, solo se llama a la función correspondiente al objeto señalado y no se comprueba el especificador de acceso. Entonces, se llama a una función privada de clase derivada a través de un puntero de clase base.

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 *