2012-08-16 121 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。您只能從成員方法訪問它。