2009-12-15 63 views
6

如果我從另一個類派生一個類並覆蓋函數,我可以通過在派生類中執行myFunc的內部調用Base::myFunction()來調用基函數。強制派生類來調用基函數

但是 - 是否有一種方法可以在我的Base類中定義基函數在任何情況下都被調用,而且不會在覆蓋函數中顯式調用基函數? (之前或執行派生功能之後)

甚至更​​好,如果我有我的虛擬Base類的虛函數,和兩個實現的私有函數before()after(),是否有可能在Base類之前定義並且在調用此類Base類的任何派生類中的函數後,將調用before()after()

謝謝!

+4

這是什麼語言? – 2009-12-15 19:56:23

+2

很可能C++('Base :: myFunction'好像是C++) – 2009-12-15 20:06:23

+0

我不禁想到這需要面向方面的編程,儘管可悲的是實現仍然缺乏。 – 2009-12-15 20:38:58

回答

21

不,這是不可能的。
但是你可以通過調用不同的虛擬功能,像這樣模擬它:

class Base 
{ 
public: 
    void myFunc() 
    { 
    before(); 
    doMyFunc(); 
    after(); 
    } 

    virtual void doMyFunc() = 0; 
}; 
+0

+1,我剛剛發佈了這個建議。 – Roddy 2009-12-15 20:02:18

+8

如果您使虛擬函數受保護(甚至是私有的),那麼您可以禁止其他代碼直接通過對基礎的引用調用虛擬方法(如果它們具有對派生類型的引用,則派生類可以公開該方法可用) – 2009-12-15 20:08:04

+0

這服務我的需求!謝謝 :) – Mat 2009-12-15 20:08:56

0

你試圖阻止派生類重載/覆蓋基中的方法。您可以通過將方法標記爲「不可覆蓋」(取決於語言)來鼓勵它,但總會有解決方法。

換句話說,你不能強迫某人以特定的方式使用你的班級,只告訴他們應該使用它的方式。

+1

不 - 我想要的方法被覆蓋 - 但我希望在派生類中實現之前調用基本函數 – Mat 2009-12-15 20:07:43

+0

有趣的是,我得到了一個downvote * 3 *年後沒有任何評論。 – hometoast 2012-07-09 11:03:44

0

回答了C++,你不能有一個繼承功能「無形」叫你想要的方式。

通過繼承類調用的唯一方法是構造函數和析構函數。

相關問題