2012-12-18 81 views
2

可能重複:
cannot call base class protected functions?基類的受保護的方法中的對象

下編譯此克++:

class A 
{ 
protected: 
    void f(){} 
}; 

class B: public A 
{ 
    void g() 
    { 
     A a; 
     f(); //This works 
     a.f(); //Error: "A::F() is protected" 
     this->f(); //Works 
     ((A*)this)->f(); //Same error 
    } 
}; 

獲取關於調用用於受保護的功能的錯誤非基類的這個對象。編譯器是GCC - 但是在其他版本的GCC下工作的代碼相同。發生什麼事了,因爲在調用基類的受保護方法時,除非它通過this,否則是verboten

編輯:對不起,我的壞。這是所有規格;在工作的另一個地方,我沒有注意到有一種友誼。請投票結束。

+0

只需自己刪除它。 – ravenspoint

+0

不能,它已被回答。 –

回答

1

你不必通過this訪問f - 你可以從B類型的任何對象訪問它。例如,這將內部B::g工作:

B b; 
b.f(); 

的C++ 03標準說(11.5):

當朋友或派生類的成員函數引用被保護的非靜態成員函數或受保護的基類非靜態數據成員之外,除了第11章中描述的那些之外,還應用訪問檢查。除了形成指向成員(5.3.1),的指針之外,訪問必須通過指向,或派生類本身的對象(或從該類派生的任何類)

所以,你可以從B或派生類型的對象訪問fB - 包括但不限於*this

C++ 11標準包含類似的限制(11.4)

1

你調用從實例A. F(函數f())是B的私人活動,從B內部,你可以這樣做:

this->f() 

但是,如果你犯了一個新的A的實例和你一樣,然後調用它的f(),它受到保護。