2010-08-26 80 views
2

說我有一個抽象類只有在引用基類時才能調用的方法? C++

class NecessaryDanger 
{ 
public: 
    virtual void doSomethingDangerous() =0; 
} 

和一類是派生自此類:

class DoesOtherStuff : public NecessaryDanger 
{ 
    //stuff 
    void otherMethod(); 
    void doSomethingDangerous(); 
} 

是有一種方法可以只允許像

doSomethingDangerous()的訪問
DoesOtherStuff d; 
d = DoesOtherStuff(); 
d.otherMethod(); //OK 
d.doSomethingDangerous(); //error 

NecessaryDanger* n = &d; 
n->doSomethingDangerous(); //OK 

我還不是很擅長C++,所以上面的代碼可能不太對,但你也許會明白。我有一組類需要能夠做出「危險的事情」(以他們自己的特殊方式),如果這些類的不止一個對象做這個危險的事情,可能會引發問題。我想有一個只有一個對象的必需的指針的管理器類。如果方法doSomethingDangerous只能由必需的對象來調用,那麼意外的調用會更難以發生,並且會讓我頭痛不已。

在此先感謝您的幫助。對不起,如果這是一個愚蠢的問題!

回答

4

當然。只需在派生類中創建private,並在基礎中創建public

當然,如果NecessaryDanger是公共基地,那麼任何人都可以施放和打電話。您可能想將其設爲私人基地並使用friend

class DoesOtherStuff : private NecessaryDanger 
{ 
    //stuff 
    void otherMethod(); 

private: 
    void doSomethingDangerous(); 

    friend class DangerManager; 
} 
+0

你能解釋一下如何去和朋友一起做這件事嗎?我是否會像派生類一樣從基類派生:私有基礎,將危險方法設爲私有,並將基類聲明爲朋友? 爲什麼使基地私人防止鑄造? 謝謝 – Johnny 2010-08-26 06:07:54

+0

更新了代碼示例。這幾乎和你所描述的一樣,但是讓經理級別成爲朋友:你希望它能夠完全訪問「私人」的東西。使基地保密是防止施放到基地的,因爲當某些東西是私人的時候,班級本身和其朋友之外沒有任何東西可以告訴它存在。 – Potatoswatter 2010-08-26 06:15:01

+0

感謝您的編輯!但是,這不會允許我在DangerManager的任何地方爲任何對象調用此方法嗎?那麼如果我需要在DangerManager之外的某個地方稍後在其他環境中調用doSomethingDangerous呢? 我仍然會像從DoesOtherStuff d危險管理器中調用此= DoesOtherStuff(); d.doSomethingDangerous;對?有沒有一種方法我只能稱之爲必要的危險* n; N-> doSomethingDangerous()?感謝您的支持。 – Johnny 2010-08-26 06:19:24

2

在超類中刪除virtual分類器,使得編譯器編譯時結合基於變量類型,而不是運行時間綁定基於對象類型。

+0

如何消除虛擬解決問題?這將更有可能打破一切。 – Potatoswatter 2010-08-26 06:16:20

+0

調用'doSomethingDangerous()'上'NecessaryDanger'變量調用'NecessaryDanger :: doSomethingDangerous',不管是什麼類型的包含的變量是對象。刪除'虛擬'打破該方法的多態性,這是提問者想要的。 – 2010-08-26 06:24:47

+0

他是如何表明他不想要多態性的? – Potatoswatter 2010-08-26 06:31:20

0

大廈Potatswatter的迴應:)

Here是香草的建議是:(尤其是1和2)適用於這種情況下。

準則#1:不想做 接口非虛,使用模板 方法。
準則#2:優先使 虛擬功能保密。
準則#3:只有派生類需要調用虛擬函數的基本實現時,才能使虛擬函數受保護。

析構函數 唯一的特例:

方針#4:基類的析構函數 應該是公開和虛擬, 或保護和非虛。

相關問題