क्या यह override
विनाशकों के लिए अच्छा अभ्यास है? क्यों या क्यों नहीं? उदाहरण:क्या विनाशक को ओवरराइड करना अच्छा अभ्यास है?
class Foo : Base
{
public:
~Foo() override {}
};
क्या यह override
विनाशकों के लिए अच्छा अभ्यास है? क्यों या क्यों नहीं? उदाहरण:क्या विनाशक को ओवरराइड करना अच्छा अभ्यास है?
class Foo : Base
{
public:
~Foo() override {}
};
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() {}
};
यह संकलित करता है।
अपने लक्ष्य Foo
कि आप Base
एक virtual
नाशक, यह ~Foo
पर override
कीवर्ड के साथ है करने के लिए सबसे आसान तरीका है की उम्मीद में राज्य के लिए है। Foo*
को Base*
के माध्यम से ~Foo
virtual
पर निर्भर करता है, यह कुछ लोगों के लिए उपयोगी हो सकता है, इस पर निर्भर करता है।
अन्य इस स्थिति को देखने के लिए override
शब्द का उपयोग करके नाराज हो सकते हैं।
निर्धारित करें कि लोगों override
का उपयोग करके offenced जा रहा है और अधिक, या Foo
Base
एक आभासी नाशक है कि में राज्य के लिए सक्षम किया जा रहा है, तो Base
के सूचक के माध्यम से Foo
का एक उदाहरण को हटाने व्यवहार परिभाषित किया गया है की तुलना में कम महत्वपूर्ण है। मैं आपके लिए यह निर्णय नहीं ले सकता।
जैसा कि @ हावर्ड हिन्नेंट ने टिप्पणियों में कहा है, एक स्पष्ट विनाशक जोड़ने के परिणाम हैं; यदि आप ऐसा करते हैं, तो 5 के नियम और =default
, =delete
का पालन करें या प्रतिलिपि/चाल वस्तु निर्माण/असाइनमेंट ऑपरेटर लागू करें।
static_assert
Base
में एक आभासी विनाशक हो सकता है, जब तक कि आपको किसी अन्य कारण के लिए विनाशक की आवश्यकता न हो।
सहमत (और ऊपर उल्लिखित)। लेकिन यह भी विचार करें कि एक निहित घोषित विनाशक का उपयोग करना सबसे अच्छा है या नहीं। जब आप एक विनाशक ('ओवरराइड 'या नहीं) जोड़ते हैं, तो आप निहित रूप से घोषित चाल सदस्यों को निहित रूप से अक्षम करते हैं। और यदि आपकी प्रतिलिपि सदस्य निहित हैं, तो आप बहिष्कृत व्यवहार पर भरोसा कर रहे हैं। जब आप उपयोगकर्ता द्वारा घोषित विनाशक जोड़ते हैं तो इसे सभी को ध्यान में रखा जाना चाहिए। इसे 'ओवरराइड' चिह्नित करने के उद्देश्य से विनाशक _only_ जोड़ना अधिक हो सकता है। '~ Foo()' 'वर्चुअल 'सुनिश्चित करने के अन्य तरीके हैं, उदाहरण:' static_assert (std :: has_virtual_destructor
जहां तक मैं डुप्लिकेट प्रश्न बता सकता हूं, यह जवाब नहीं देता है कि यह अच्छा अभ्यास है, वास्तव में इसके बारे में एक अनुत्तरित टिप्पणी है। –