2

我正在尝试一个简单的 C++ 继承示例。但我就是拿不下来。当我尝试获取B从类继承的类的受保护成员时,A它说这A::baz是受保护的。

#include <iostream>

class A {
    public:
        int foo;
        int bar;
    protected:
        int baz;
        int buzz;
    private:
        int privfoo;
        int privbar;
};

class B : protected A {}; // protected members go to class B, right?

int main() {
    B b;

    b.baz; // here is the error [A::baz is protected]
}

我似乎找不到我做错了什么。我已经尝试更改class B : protected A为,: public A但它仍然无法正常工作。

4

7 回答 7

5

受保护的继承只会影响您的类的客户如何看待基类的公共接口。受保护的继承将基类的公共成员标记为对继承类的用户受保护。

所以baz在你的例子中不是公开的,它受到 B 的保护,因此编译器错误。

于 2012-08-16T18:01:33.257 回答
2

您可以从派生类内部而不是外部访问protected成员。

class B : protected A 
{
   void foo() 
   {
       int x = foo; //ok
       x = baz;     //ok
       x = privfoo; //error
   }
};

继承类型仅限制基类访问。例如,如果您选择protected继承,则所有public方法都A将成为protected外部方法,其余方法保持不变。

于 2012-08-16T18:01:48.573 回答
0

受保护的字段只能由声明它们的类中的方法或从声明类继承的类访问。您正在尝试从全局函数访问受保护的字段。

于 2012-08-16T18:01:46.987 回答
0

因为A::baz是受保护的,B所以可以访问它:

class B : public A
{
  public:
    int some_other_method()
    {
        return baz;
    }
};

但这不会让其他代码访问它。

于 2012-08-16T18:01:53.270 回答
0

protected 访问说明符类似于 private。它唯一的区别实际上发生在继承上。当一个类从另一个类继承时,派生类的成员可以访问从基类继承的受保护成员,但不能访问其私有成员。

更多信息在这里

于 2012-08-16T18:02:08.793 回答
0

当一个成员是protected时,它只能从定义它的类及其后代的方法中访问。

您要做的是protected/private从这些类外部的代码访问成员,这是不允许的。您只能public从类范围之外访问类的成员。

于 2012-08-16T18:02:10.710 回答
0

您应该阅读 C++ 中的公有/私有继承。您想要实现的目标是通过替换

class B : protected A {};

经过

class B : public A {};

编辑:我读得太快了,没有注意到你试图baz从 main 访问。您只能从成员方法访问它。

于 2012-08-16T18:02:59.463 回答