📜  如何在C++中的类外部访问私有/受保护的方法

📅  最后修改于: 2021-05-30 10:07:50             🧑  作者: Mango

先决条件: C++中的访问修饰符,运行时多态

私有:声明为私有的类成员只能由该类内部的函数访问。类之外的任何对象或函数都不允许直接访问它们。只允许成员函数或朋友函数访问类的私有数据成员。

我们可以使用虚函数访问其他类中私有方法虚函数是在基类中声明并由派生类重新定义(重写)的成员函数。使用指针或对基类的引用来引用派生类对象可以调用该对象的虚函数并执行该派生类的函数版本。

程序1:演示私有访问修饰符

C++
// C++ program to demonstrate private
// access modifier
#include 
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
    // Overrride 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;
}


C++
// C++ program to demonstrate protected
// access modifier
#include 
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
    // Overrride 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;
}


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

说明

在上述程序中,父类具有一个函数函数void disp() 。子类创建了另一个具有相同名称的函数,即void disp(),但该函数是私有的,这意味着该类之外的任何对象或函数都不能直接访问该函数。在main()中,我们首先创建子类的对象,并传递一个参数以初始化子类中的secret_key变量,然后,我们将子类的对象的地址存储在基类指针中,这也称为cast 。。现在,基类指针保存子类对象的地址,但是当使用基类指针调用函数时,它将仅调用基类函数。但是如果要调用子类函数以使基类函数虚拟化。这也称为运行时多态。

受保护的:受保护的访问修饰符与私有访问修饰符相似,不同之处在于,声明为“受保护”的类成员在该类外部不可访问,但是该类的任何子类(派生类)都可以访问它们。

程序2:演示受保护的访问修饰符

C++

// C++ program to demonstrate protected
// access modifier
#include 
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
    // Overrride 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;
}
输出:
This is the protected  disp method of child class 
The key is 1019

说明

在上面的示例中,父类具有函数void disp() ,它是一个函数。子类创建了另一个具有相同名称的函数,即void disp(),但该函数是私有的,这意味着该类之外的任何对象或函数都不能直接访问该函数。在main()中,我们首先创建一个子类的对象,并传递一个参数以初始化子类中的secret_key变量,此后,我们将子类的对象的地址存储在基类指针中,这也称为向上转换。现在,基类指针保存子类对象的地址,但是当使用基类指针调用函数时,它将仅调用基类函数。但是如果要调用子类函数以使基类函数虚拟化。这也称为运行时多态

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”