公共/受保护/私有继承的麻烦

时间:2012-08-16 17:59:31

标签: c++ inheritance protected private-members

我正在尝试一个简单的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,但仍无效。

7 个答案:

答案 0 :(得分:5)

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

因此,示例中的baz不是公共的,它受B保护,因此编译错误。

答案 1 :(得分:2)

您可以从里面一个派生类访问protected成员,而不是在外面。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

由于A::baz受到保护,B可以访问它:

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

但这并不允许其他代码访问它。

答案 4 :(得分:0)

  

受保护的访问说明符类似于私有。这只是   实际上与继承发生差异。当一个类继承自   另一个,派生类的成员可以访问受保护的   成员继承自基类,但不是其私有成员。

更多信息here

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您应该阅读C ++中的公共/私有继承。您希望通过替换

来实现
class B : protected A {};

通过

class B : public A {};
编辑:我读得太快,没有注意到你试图从main访问baz。您只能从成员方法访问它。