2012-08-16 126 views
2

我正在尝试C++中的继承的简单示例。但我无法理解它。当我试图获得从类A继承的类B的受保护成员时,它表示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,但它仍然不起作用。

+1

它很少使用公共继承以外的任何东西。 – 2012-08-16 18:04:00

+0

http://www.parashift.com/c++-faq/access-rules-with-priv-inherit.html – Derek 2012-08-16 18:05:45

回答

5

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

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

+0

如果我没有使用“公共”,“私人”或“受保护”并且只是做了什么:'B类:A {}'? – 2012-08-16 18:05:27

+5

@ user6607然后它默认是私有的 – Caesar 2012-08-16 18:05:45

0

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

2

您可以访问protected成员里面的派生类,而不是外部。

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

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

0

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

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

但是,这并不让其他代码访问它。

0

受保护的访问说明符类似于私有。其实只有 差异发生在继承。当一个类从另一个类继承 时,派生类的成员可以访问从基类继承的受保护 成员,但不能访问其私有成员。

更多关于它here

0

当构件是protected,它只能从定义它及其后代的类的方法中访问。

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

0

您应该阅读关于C++中的公共/私有继承。你想实现什么是替代

class B : protected A {}; 

完成由

class B : public A {}; 

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