📜  当对C++中的派生类方法进行更严格的访问时,会发生什么情况?(1)

📅  最后修改于: 2023-12-03 15:25:36.308000             🧑  作者: Mango

当对C++中的派生类方法进行更严格的访问时,会发生什么情况?

在C++中,派生类(子类)继承了基类(父类)的方法和属性。当我们在派生类中对继承的方法进行更严格的访问时,会发生一个叫做“访问控制”的过程。访问控制在C++中是相当重要的,它用来控制程序中的数据和代码访问权限。 C++中有三种访问权限:

  1. 公共访问(public)

公共访问权限是最宽松的,所有的类成员都可以访问。在派生类中,公共成员可以直接继承和访问。

  1. 保护访问(protected)

保护访问权限只允许类成员函数和派生类中的函数访问。在派生类中,保护成员也可以被访问但是不能从外部访问。

  1. 私有访问(private)

私有访问权限只能被类成员函数访问,任何派生类都不能访问私有成员。

下面是一个简单的代码示例:

#include<iostream>

using namespace std;

// 基类
class Rectangle{
    public:
        int height;
        int width;

        void display(){
            cout << "Height: " << height << endl;
            cout << "Width : " << width << endl;
        }
};

// 派生类
class Square: public Rectangle{

    public:

    // 更严格的访问权限
    private:
        void setHeight(int h){
            height = h;
        }

    public:
        void setWidth(int w){
            width = w;
        }

        void displayAll(){
            setHeight(2);  // 这里调用了私有函数
            display();     // 继承自基类的公共函数
            cout << "Area  : " << height*width << endl;
        }
};

// 测试
int main(){
    Square s;
    //s.setHeight(3);  // 私有函数无法从外部访问
    s.setWidth(4);
    s.displayAll();
    return 0;
}

在上述代码中,Square类继承自Rectangle类,但是在Square类中,我们对setHeight函数进行了私有化,它只能被Square类自身的成员函数访问,从而更加保护了height属性。另外,在Square类的displayAll函数中,我们对继承自Rectangle类的display函数进行了访问,从而打印出了Rectangle类的width和Square类的height,还计算了它们的乘积作为Square类的面积输出。此时,Square类的对象s可以访问setHeight和setWidth函数,但只有Square类自己的成员能够访问setHeight, 并且从外面无法访问setHeight函数,这是因为派生类中看不到基类中的private成员。