从公共派生类访问受保护的成员

Access protected members from a public derived class

本文关键字:受保护 成员 访问 派生      更新时间:2023-10-16

尝试从继承公共的派生类的方法访问基类的受保护成员时出现错误。

我通过引用将基类的两个对象传递给派生类的方法,并尝试访问对象的受保护成员。然而,编辑抱怨道。

从某种意义上说,这就是我要做的:

class A {
protected:
  int x;
};
class B:public A
{
public:
  void test(A &obj1, A &obj2)
  {
    obj1.x = 1;
    obj2.x = 2;
  }
};

这是编辑的抱怨:

 int A::x
 protected member A::x (declared at line 5) is not accessible though "A" pointer or object.

我的代码出了什么问题,我该怎么做才能纠正它?

谢谢。

只能访问与派生对象类型相同的类的基类保护成员。您必须创建一个公共方法来获取成员或其他解决方法。想象一下,你有另一个 C 类,它继承了 A 作为私有。可以将 C 作为 A 引用传递给 B 方法,但基类成员将不可访问。如果引用传递给 B 引用的 B 方法,则可以访问其中的受保护成员。

对于类 A,变量 x 受到保护,对于类 A 来说,它的作用类似于私有的,因此成员变量 A::X 不可访问。

但是,如果您更改方法

void test(A &obj1, A &obj2)

void test(B &obj1, B &obj2)

然后,您可以从类 B 访问变量 x,因为它可以像继承一样受保护。

因此,整个代码可以像下面这样编写,用于访问类 B 中的 x:

class A {
    protected:
        int x;
};
class B:public A
{
    public:
        void test(B &obj1, B &obj2)
        {
            obj1.x = 1;
            obj2.x = 2;
        }
};