Cómo acceder al método privado/protegido fuera de una clase en C++

Requisitos previos: modificadores de acceso en C++ , polimorfismo en tiempo de ejecución

Privado: solo las funciones dentro de la clase pueden acceder a los miembros de la clase declarados como privados . No se permite el acceso directo a ellos por ningún objeto o función fuera de la clase. Solo las funciones miembro o las funciones amigas pueden acceder a los datos privados de los miembros de una clase.

Podemos acceder al método privado en otra clase usando la función virtual . Una función virtual es una función miembro que se declara dentro de una clase base y se redefine (anulada) por una clase derivada. Hacer referencia a un objeto de clase derivada mediante un puntero o una referencia a la clase base puede llamar a una función virtual para ese objeto y ejecutar la versión de la función de la clase derivada.

Programa 1: Para demostrar el modificador de acceso privado 

C++

// C++ program to demonstrate private
// access modifier
#include <iostream>
using namespace std;
 
// Parent class having virtual
// function disp()
class Parent {
public:
    // Create virtual function
    virtual void disp()
    {
        cout << "This is the public disp"
             << " method of Parent class" << endl;
    }
};
 
// Child class inherit to parent class
class Child : public Parent {
private:
    int secret_key;
 
    // Private method which will be called
    // Override the method of parent class
    void disp()
    {
        cout << "This is the private disp "
             << "method of child class "
             << endl;
        cout << "The key is "
             << secret_key << endl;
    }
 
public:
    // Constructor of the child class
    Child(int key) { secret_key = key; }
};
 
// Driver Code
int main()
{
    // Create object of child class
    Child child(1019);
 
    // Upcasting
    Parent* obj = &child;
 
    // Function call of child class
    obj->disp();
    return 0;
}
Producción: 

This is the private disp method of child class 
The key is 1019

 

Explicación :

En el programa anterior, la clase padre tiene una función void disp() que es una función virtual . La clase secundaria ha creado otra función con el mismo nombre, es decir, void disp() pero esa función es privada, lo que significa que ningún objeto o función fuera de la clase puede acceder directamente a ella. En main() , primero estamos creando un objeto de clase secundaria y pasando un parámetro para inicializar la variable secret_key en la clase secundaria. Después de eso, estamos almacenando la dirección del objeto de clase secundaria en un puntero de clase base, esto también se llama upcasting. Ahora, el puntero de la clase base contiene la dirección del objeto de la clase secundaria, pero al llamar a una función usando el puntero de la clase base, solo llamará a las funciones de la clase base. Pero si quiere que llame a funciones de clase secundaria para hacer que las funciones de clase base sean virtuales . Esto también se denomina polimorfismo en tiempo de ejecución.

Protegido: el modificador de acceso protegido es similar al de los modificadores de acceso privado, la diferencia es que los miembros de la clase declarados como protegidos son inaccesibles fuera de la clase, pero cualquier subclase (clase derivada) de esa clase puede acceder a ellos.

Programa 2: Para demostrar el modificador de acceso protegido 

C++

// C++ program to demonstrate protected
// access modifier
#include <iostream>
using namespace std;
 
// Parent class having virtual
// function disp()
class Parent {
public:
    // Create virtual function
    virtual void disp()
    {
        cout << "This is the public disp"
             << " method of Parent class"
             << endl;
    }
};
 
// Child class inherit to parent class
class Child : public Parent {
protected:
    int secret_key;
 
    // Private method which will be called
    // Override the method of parent class
    void disp()
    {
        cout << "This is the protected  disp "
             << "method of child class "
             << endl;
        cout << "The key is "
             << secret_key << endl;
    }
 
public:
    // Constructor of child class
    Child(int key) { secret_key = key; }
};
 
// Driver Code
int main()
{
    // Create object of child class
    Child child(1019);
 
    // Upcasting
    Parent* obj = &child;
 
    // Function call of child class
    obj->disp();
    return 0;
}
Producción: 

This is the protected  disp method of child class 
The key is 1019

 

Explicación

En el ejemplo anterior, la clase principal tiene la función void disp(), que es una función virtual . La clase secundaria ha creado otra función con el mismo nombre, es decir, void disp() pero esa función es privada, lo que significa que ningún objeto o función fuera de la clase puede acceder directamente a ella. En main(), primero estamos creando un objeto de clase secundaria y pasando un parámetro para inicializar la variable secret_key en la clase secundaria, luego almacenamos la dirección del objeto de clase secundaria en un puntero de clase base, esto también se denomina conversión ascendente. Ahora, el puntero de la clase base contiene la dirección del objeto de la clase secundaria, pero al llamar a una función usando el puntero de la clase base, solo llamará a las funciones de la clase base. Pero si quiere que llame a funciones de clase secundaria para hacer que las funciones de clase base sean virtuales . Esto también se llama polimorfismo en tiempo de ejecución .
 

Publicación traducida automáticamente

Artículo escrito por sachinbhutani 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 *