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