【问题标题】:Access protected members from a public derived class从公共派生类访问受保护的成员
【发布时间】:2018-04-17 09:10:42
【问题描述】:

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

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

总的来说,这是我想要做的:

class A {
protected:
  int x;
};

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

this是编辑的抱怨:

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

我的代码有什么问题,我可以做些什么来纠正它?

谢谢。

【问题讨论】:

  • 请复制粘贴错误信息,不要使用外部链接或图片。如果你尝试编译,编译器可能会给你同样的信息,这样更容易复制。
  • 显然我还不能上传图片,因为我没有足够的徽章。相反,会自动创建一个链接并写入错误。
  • 您可以通过B 对象访问x,但不能通过A 对象访问。
  • 访问修饰符 Protected 表示成员变量 x 可以被 A 类而不是 B 类内部的方法访问,因此不能通过 B 类访问。

标签: c++ inheritance scope pass-by-reference


【解决方案1】:

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

【讨论】:

  • 访问不需要专门通过this,但需要通过派生类型的对象。
【解决方案2】:

对于 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;
        }
};

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2015-12-30
    • 2018-05-07
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多