2016-09-16 133 views
0
template<int N> 
struct B 
{ 
protected: 
    void f() {} 
}; 

template<int N> 
struct A : B<N> 
{ 
    A() 
    { 
     this->f(); // ok 
     f(); // error : use of undeclared identifier 'f' 
    } 
}; 

int main() 
{ 
    A<8> a; 
} 

我的C++編譯器是叮噹3.8。爲什麼clang不允許派生類調用受保護的基函數?

爲什麼clang不允許派生類調用受保護的基函數?

+1

使用'B :: f()',這不是特定的鏗鏘聲。 –

+0

'this-> f();'或'B :: f()' – Danh

+0

受保護的成員不像私有成員那樣私有,只能爲聲明它們的類的成員訪問,但它們不是公開爲公衆成員,可以通過任何功能訪問。 未聲明爲靜態的受保護成員只能通過派生類的指針,引用或對象訪問派生類中的朋友和成員函數。 –

回答

-4

這不是叮噹聲但C++訪問控制和protected訪問說明符。

語言規範希望確保您正在訪問屬於派生類對象的某些基類子對象的受保護成員。您不應該能夠訪問某些不相關的基本類型獨立對象的受保護成員。

因此,您必須通過pointer->member語法,reference.memberobject.member語法訪問受保護的成員,其中指針/引用/對象指的是派生類。

這正是在線與您在您的例子所示的內容:

template<int N> 
struct B 
{ 
protected: 
    void f() {} 
}; 

template<int N> 
struct A : B<N> 
{ 
    A() 
    { 
     this->f(); // ok 
     f(); // error : use of undeclared identifier 'f' 
    } 
}; 

Link: protected成員不是私有成員,它們只能訪問到它們所聲明的類成員爲私有,但它們不像公共成員那樣公開,可以通過任何功能訪問它們。

未聲明爲靜態的受保護成員只能通過派生類的指針,引用或對象在派生類中訪問朋友和成員函數。

+0

fyi代碼在將'protected'更改爲'public'時將無法編譯 – Danh

+1

我將此標記爲不是答案,可以通過該重複問題找到答案。 – Danh

+1

@Danh雖然這個問題在其他地方得到了回答,但這並不能說明問題的答案。這個答案是完全有效的(無論是否正確,我不知道 - 這不是我的專業知識),並且不會抄襲關於重複問題的現有答案。請不要僅因爲回答者不知道所有其他39528191問題和答案而提出錯誤的標記。 – Siyual

相關問題