问题描述
这是怎么编译的?变量 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;
}
解决方法
protected
和 private
关键字限制了哪些类可以访问成员变量,而不是哪些对象可以访问它。
因此,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}} 的成员变量。