孩子如何通过成员方法访问另一个孩子的受保护成员

问题描述

这是怎么编译的?变量 d 内受保护。子类方法如何工作能够修改子类受保护成员变量的另一个实例?孩子可以通过成员方法访问另一个孩子的受保护成员吗

#include <iostream>

using namespace std;

class Parent
{
public:
    void print()
    {
        cout << d;
    }
protected:
    int d = 2;
};

class Child : public Parent
{

public:
    void works(Child* some_other_child)
    {
        some_other_child->d = 3;
    }
};

int main()
{
    Parent *p = new Parent();
    Child *c = new Child();
    Child *co = new Child();
    c->works(co);
    co->print();
    return 0;
}

解决方法

protectedprivate 关键字限制了哪些可以访问成员变量,而不是哪些对象可以访问它。

因此,Child::works() 方法中的代码能够访问任何 Parent::d 对象的受保护的 Child 成员变量,因为 Child 是 {{ 1}}。

,

因为Child类继承自Parent类,所以Child类继承了int d成员变量。当调用 Child 类的构造函数时,它会创建 int d 成员变量作为 Child 类的成员。 int d 中的 Child 又是一个 protected 成员变量。

然后,如果您调用 Child 类的方法,它自然可以访问它所拥有的类的所有成员。因此,由于 works 方法归 Child 类所有,因此它可以访问 int d 成员变量并允许对其进行更改(如果您不将其设置为 const 方法,例如如void works(Child* some_other_child) const,这意味着该方法不允许更改其类的任何成员变量)。

当您将指针(或引用)传递给 Child 的另一个对象时,由于它是从 Child 的方法调用的,因此它也可以更改成员,因为它可以访问 {{ 1}} 的成员变量。