¿Qué sucede cuando se otorga un acceso más restrictivo a un método de clase derivada en C++?

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

C++

#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, obtendrá un error del compilador porque fun() es privado en la clase derivada. 

C++

int main()
{
    Derived d;
    d.fun(1);
    return 0;
}

¿Qué pasa con el siguiente programa? 

C++

#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 «Derivado::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 verifican 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 apuntado y no se verifica 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 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 *