2017-05-12 10 views
5

क्या यह override विनाशकों के लिए अच्छा अभ्यास है? क्यों या क्यों नहीं? उदाहरण:क्या विनाशक को ओवरराइड करना अच्छा अभ्यास है?

class Foo : Base 
{ 
public: 
    ~Foo() override {} 
}; 
+0

जहां तक ​​मैं डुप्लिकेट प्रश्न बता सकता हूं, यह जवाब नहीं देता है कि यह अच्छा अभ्यास है, वास्तव में इसके बारे में एक अनुत्तरित टिप्पणी है। –

उत्तर

4
struct Base { 
    virtual ~Base() {} 
}; 
struct Foo : Base { 
    ~Foo() override {} 
}; 

इस संकलित करता है।

struct Base { 
    ~Base() {} 
}; 
struct Foo : Base { 
    ~Foo() override {} 
}; 

ऐसा नहीं है।

struct Base { 
    ~Base() {} 
}; 
struct Foo : Base { 
    virtual ~Foo() {} 
}; 

यह संकलित करता है।

Live example

अपने लक्ष्य Foo कि आप Base एक virtual नाशक, यह ~Foo पर override कीवर्ड के साथ है करने के लिए सबसे आसान तरीका है की उम्मीद में राज्य के लिए है। Foo* को Base* के माध्यम से ~Foovirtual पर निर्भर करता है, यह कुछ लोगों के लिए उपयोगी हो सकता है, इस पर निर्भर करता है।

अन्य इस स्थिति को देखने के लिए override शब्द का उपयोग करके नाराज हो सकते हैं।

निर्धारित करें कि लोगों override का उपयोग करके offenced जा रहा है और अधिक, या FooBase एक आभासी नाशक है कि में राज्य के लिए सक्षम किया जा रहा है, तो Base के सूचक के माध्यम से Foo का एक उदाहरण को हटाने व्यवहार परिभाषित किया गया है की तुलना में कम महत्वपूर्ण है। मैं आपके लिए यह निर्णय नहीं ले सकता।

जैसा कि @ हावर्ड हिन्नेंट ने टिप्पणियों में कहा है, एक स्पष्ट विनाशक जोड़ने के परिणाम हैं; यदि आप ऐसा करते हैं, तो 5 के नियम और =default, =delete का पालन करें या प्रतिलिपि/चाल वस्तु निर्माण/असाइनमेंट ऑपरेटर लागू करें।

static_assertBase में एक आभासी विनाशक हो सकता है, जब तक कि आपको किसी अन्य कारण के लिए विनाशक की आवश्यकता न हो।

+4

सहमत (और ऊपर उल्लिखित)। लेकिन यह भी विचार करें कि एक निहित घोषित विनाशक का उपयोग करना सबसे अच्छा है या नहीं। जब आप एक विनाशक ('ओवरराइड 'या नहीं) जोड़ते हैं, तो आप निहित रूप से घोषित चाल सदस्यों को निहित रूप से अक्षम करते हैं। और यदि आपकी प्रतिलिपि सदस्य निहित हैं, तो आप बहिष्कृत व्यवहार पर भरोसा कर रहे हैं। जब आप उपयोगकर्ता द्वारा घोषित विनाशक जोड़ते हैं तो इसे सभी को ध्यान में रखा जाना चाहिए। इसे 'ओवरराइड' चिह्नित करने के उद्देश्य से विनाशक _only_ जोड़ना अधिक हो सकता है। '~ Foo()' 'वर्चुअल 'सुनिश्चित करने के अन्य तरीके हैं, उदाहरण:' static_assert (std :: has_virtual_destructor {}) '। –

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