2011-05-31 27 views
1

示例代碼我能保持一定的功能,從被繼承在C++

#include <iostream> 

using namespace std; 

class Base 
{ 
public: 
    virtual void Func() 
    { 
     cout << "\nIn base func"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    void Func() 
    { 
     cout << "\nIn derived"; 
    } 
}; 

class Derived2 : public Derived 
{ 
public: 
    void Func() 
    { 
     cout << "\nIn derived2"; 
    } 
}; 

int main() 
{ 
    Base* lnewbase = new Derived2(); 

    lnewbase->Func(); 

    return 0; 
} 

作爲一個例子,在上述代碼中,我不想Func鍵()的衍生被繼承(密封在C#),其這就是爲什麼沒有虛擬關鍵字,雖然我知道在這種情況下它不會改變任何東西。有什麼辦法可以禁止這個函數被繼承,同時確保它仍然是一個公共方法嗎?

+0

我認爲你對「繼承」的使用是誤導性的 - 相反,我會說「我可以保留某些函數不會被C++重載」。說「繼承」使我認爲你希望函數不能被子類的實例訪問(你可以通過在子類中聲明它是私有的)來實現該函數。 – 2011-05-31 17:12:23

+2

這是一個危險的編輯,與OP詢問的原始問題有很大不同。我認爲,即使對後者的回答是「不,這是不可能的」,我認爲你可以認爲當他說「繼承」時,OP意味着「覆蓋」。與「密封」類似可能會引起誤解,因爲OP可能只是誤解了在這種情況下「密封」的實際做法。 – eldarerathis 2011-05-31 17:13:33

+0

@愛德華:我認爲這不是誤導。引用你'我希望這個函數不能被子類的實例訪問',但是我不能使它成爲私有的,因爲那麼客戶端將無法訪問它。如果我錯了,請糾正我,但是「超載」的含義與「繼承」或「過度纏身」的含義完全不同? – Samaursa 2011-05-31 17:17:38

回答

0

否; C++沒有相當於C#的sealed修飾符。

+1

C++ 03沒有,但C++ 11擁有'final'成員函數裝飾器,它直接類似於C#和C++/CLI的'sealed'。 – ildjarn 2011-05-31 20:29:52

0

沒有什麼可以做的。

一旦你在一個基類虛擬中創建一個函數,就沒有什麼可以做到擺脫它的那個方面。我只能想到幾件事情來解決它:

  • 不要讓它虛擬;
  • Derived中創建一個新的公共非虛函數,它可以滿足您的需求。

然而,在這兩種情況下,Derived2將仍然能夠使Func()自己的版本,它會給你同樣的問題。