2017-10-15 184 views
2
class A 
{ 
    //friend class B; 
    protected: 
    A(){cout << "A\n";}; 

}; 
class B: virtual A 
{}; 

class C : B 
{}; 

int main() { 
C c; 
return 0; 
} 

雖然我期待由於A:A()受到保護而導致錯誤,但我能夠成功編譯此代碼。基於這樣一個事實,即對於虛擬基類,其大多數派生類直接將其稱爲基類。 上面的代碼給出了在基類中對ctor()的私有訪問的編譯錯誤[預期]。 有人可以澄清這一點,謝謝!使用受保護的C++防止派生類的繼承

+0

你想禁止從「A」繼承? –

+0

我想禁止繼承B. – knils

回答

3

具有protected訪問說明符意味着派生類可以訪問該實體。 C也衍生自A,它不必直接從它派生來獲得受保護的訪問資格。

在另一方面,private訪問將防止任何派生類具有可訪問性,既BC

沒有辦法以一種只允許直接派生類訪問構造函數(特別是一組開放式直接派生類)的方式來控制訪問。你可以做的最多的是玩private訪問和friend船與一組封閉的派生類。


爲了解決您的評論你的問題:

我想的B禁止繼承

就標誌着B作爲最終

class B final : A 
{}; 
+0

感謝您的回覆! – knils

+2

@knils - 我不能,因爲(a)你在評論中發佈了它,使其無法讀取(b)這是一個完全不同的問題,與剛剛回答的問題無關。 (c)這不是論壇或董事會,這是一個問答網站。如果您有後續問題,請將其作爲單獨問題發佈,以便能夠正確回答,而不僅僅是埋在評論中。 – StoryTeller

+0

請撤銷我在此社區提問的禁令。謝謝! – knils