2012-01-08 22 views
6

के वर्चुअल फ़ंक्शन को ओवरराइड करने से रोकें स्थिति इस तरह है।विरासत वर्ग को बेस क्लास

class Interface 
{ 
public: 
    virtual void foo() = 0; 
} 

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 

मैं चाहता हूँ कि मेरे उपयोगकर्ता एक वर्ग जो MyClass से विरासत पैदा करेगा, और वे वहाँ bar() लागू करना होगा।
लेकिन मैं कैसे पहचान सकता हूं कि वे foo() ओवरराइड नहीं करेंगे? क्योंकि मेरे foo() का उपयोग करना मेरे लिए महत्वपूर्ण है।

+0

क्या यह संकलित करता है? यदि ऐसा है, तो आपको कोई समस्या नहीं है, क्योंकि आपका फू निजी है। संपादित करें: आह, नहीं, यह संकलित नहीं करता है ... –

+2

@Mrlister: निजी विधियां अभी भी ओवरराइड हो सकती हैं। –

+0

सच है, क्षमा करें। तो कोई बात नहीं। जवाब पहले ही दिया गया है। –

उत्तर

13

सी ++ 11 आप इसे ओवरराइड होने से रोकने के final के रूप में विधि चिह्नित कर सकते हैं में:

class MyClass : Interface 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() final 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 
+0

धन्यवाद, आप मुझे सही दिशा में ले जाते हैं। लेकिन सी ++ 11 वी 1.0 'फाइनल' में 'मुहरबंद' में बदल दिया गया था। –

+5

पढ़ें [यह सवाल] (http://stackoverflow.com/questions/7026462)। 'मुहरबंद 'माइक्रोसॉफ्ट-विशिष्ट है। 'अंतिम' को C++ 11-मानक के §7.6.4 [dcl.attr.final] में परिभाषित किया गया है। –

+0

धन्यवाद! यही वह है जिसे मैं ढूंढ रहा हूं: डी – mr5

6

अन्य जवाब के अनुसार, आप final कीवर्ड सी ++ 11 (ऐसी सुविधा में उपयोग कर सकते हैं इसी तरह की है जावा के final कीवर्ड)।

सी ++ 03 कोड के लिए, आप CRTP तंत्र का उपयोग कर सकते हैं (बशर्ते आप Interface की परिभाषा बदल सकते हैं)

template<typename Derived> 
class Interface 
{ 
public: 
    void foo() // not 'virtual' 
    { 
    static_cast<Derived*>(this)->foo(); 
    } 
} 

class MyClass : public Interface<MyClass> 
{ 
public: 
    virtual void bar() = 0; 
private: 
    void foo() 
    { 
     //Some private work and checks. 
     bar(); 
    }; 
} 

तो अब आप foo() की virtual सत्ता को दूर किया है और बाध्यकारी होगा संकलन समय पर। याद रखें कि सीआरटीपी अपनी सीमा के साथ आता है, तो इसका उपयोग करना है या नहीं, आप पर निर्भर है।

संबंधित मुद्दे