2009-06-08 16 views
5

मेरे पास एक शुद्ध वर्चुअल फ़ंक्शंस वाला एक अमूर्त वर्ग है, और इससे प्राप्त कक्षाओं में से एक शुद्ध वर्चुअल फ़ंक्शंस का उपयोग नहीं करता है:शुद्ध वर्चुअल फ़ंक्शन को "हटाने" का कोई तरीका है?

class derivative: public base 
{ 
public: 
    int somevariable; 
    void somefunction(); 
}; 

वैसे भी, जब मैं इसे संकलित करने का प्रयास करता हूं, तो मुझे मिलता है एक त्रुटि (स्पष्ट रूप से, एक वर्ग को अभी भी अमूर्त वर्ग से प्राप्त होने पर सार माना जाता है और सभी शुद्ध आभासी कार्यों को ओवरराइड नहीं करता है)। वैसे भी, यह एक फ़ंक्शन

int purevirtfunc(){return 0;} 

को परिभाषित करने के लिए व्यर्थ लगता है क्योंकि इसे तकनीकीता के माध्यम से परिभाषित करने की आवश्यकता है। क्या एक सार वर्ग से कक्षा प्राप्त करने के लिए वैसे भी है और अमूर्त वर्ग के शुद्ध आभासी कार्यों में से एक का उपयोग नहीं करते हैं?

+6

यदि कोई रास्ता था, तो कोड क्या होगा यदि कोड उन अनुपूरक तरीकों में से एक कहलाता है? – Aardvark

उत्तर

40

यदि आपकी व्युत्पन्न कक्षा बेस क्लास शुद्ध वर्चुअल फ़ंक्शन का "उपयोग" नहीं करती है, तो या तो व्युत्पन्न कक्षा को आधार से नहीं लिया जाना चाहिए, या पीवीएफ वहां नहीं होना चाहिए। किसी भी मामले में, आपका डिज़ाइन गलती है और उसे फिर से विचार करने की आवश्यकता है।

और नहीं, पीवीएफ हटाने का कोई तरीका नहीं है।

1

जब आप शुद्ध वर्चुअल फ़ंक्शन वाले वर्ग से प्राप्त होते हैं, तो आपको उन कार्यों को लागू करना होगा। यदि आप नहीं करते हैं, तो आपकी व्युत्पन्न कक्षा भी सार है, और आप व्युत्पन्न वर्ग का ऑब्जेक्ट नहीं बना सकते हैं।

+0

यदि आप इस इंटरफ़ेस से अक्सर प्राप्त करते हैं तो आप उस शून्य से कार्यान्वयन भी कर सकते हैं जिसे आप प्राप्त करते हैं। –

9

अमूर्त वर्गों से प्राप्त करने का उद्देश्य यह है कि बाहरी कोड अमूर्त वर्ग का उपयोग कर सकता है और उम्मीद करता है कि सभी कार्यों को ठीक से लागू किया गया है। एक विधि को कार्यान्वित करने में सक्षम होने से कोड को इस उद्देश्य को हराया जाएगा, जिससे कोड असम्पीबल हो जाएगा। यदि आप चुनते हैं, तो आप अपवाद फेंकने के लिए स्वतंत्र हैं।

1

नं। या तो आधार वर्ग में एक डिफ़ॉल्ट कार्यान्वयन या व्युत्पन्न कक्षा में एक सरल कार्यान्वयन प्रदान करते हैं, जैसा आपने सुझाव दिया था।

14

एक शुद्ध वर्चुअल क्लास एक इंटरफेस है, जिसे आपका कोड पूरा होने की उम्मीद है। क्या होगा यदि आपने उस इंटरफेस को लागू किया और तरीकों में से एक को लागू नहीं किया? आपके इंटरफ़ेस को कॉल करने वाला कोड कैसे जानता है कि आपने विधि को लागू नहीं किया है?

आपके विकल्प हैं:

  1. विधि को लागू के रूप में आप का वर्णन (जिससे यह निजी संकेत मिलता है कि यह नहीं किया जाना चाहिए)।
  2. डिज़ाइन परिवर्तन को ध्यान में रखकर अपनी कक्षा पदानुक्रम बदलें।
5

यह बिल्कुल तकनीकी नहीं है। यदि आपकी व्युत्पन्न कक्षा माता-पिता के सभी व्यवहारों को प्रदर्शित नहीं करती है, तो इसे माता-पिता से नहीं लिया जाना चाहिए। यह एक प्रमुख डिजाइन गंध है, और आपको शायद कुछ डिज़ाइन रिफैक्टरिंग की आवश्यकता है।

0

इसकी अनुमति देने से कोई अर्थ नहीं होगा। यदि आप कार्यान्वयन के बिना फ़ंक्शन को बुलाते हैं तो क्या होगा? एक रनटाइम त्रुटि (वह मूर्खतापूर्ण होगी)? आप तर्क दे सकते हैं कि यह कुछ मामलों में एक संकलन समय त्रुटि हो सकता है, लेकिन यह संभव नहीं है यदि सटीक प्रकार ज्ञात नहीं है (e.i. आप व्युत्पन्न वर्ग के किसी फ़ंक्शन में पॉइंटर पास करते हैं)।

1

पहले से ही अच्छे उत्तर थे, लेकिन यदि आप सैद्धांतिक ओओ डिजाइन पक्ष से अधिक जानकारी चाहते हैं, तो Liskov substitution principle देखें।

0

जैसा कि कई लोगों ने पहले से ही कहा है, ऐसा लगता है कि आधार विधि शुद्ध वर्चुअल नहीं होनी चाहिए या आपको पुनर्विचार करना चाहिए कि आपकी व्युत्पन्न कक्षा वास्तव में आईएसए आधार है या नहीं।

हालांकि, बेस क्लास में शुद्ध वर्चुअल विधि के लिए कार्यान्वयन प्रदान करना संभव है। यह व्युत्पन्न कक्षाओं के लिए एक डिफ़ॉल्ट कार्यान्वयन की तरह कार्य कर सकता है, लेकिन आपको अभी भी बेस क्लास की कार्यान्वयन स्पष्टीकरण चुनने के लिए व्युत्पन्न कक्षा की आवश्यकता है।

मुझे नहीं पता कि इससे आपकी समस्या में मदद मिलेगी या नहीं।

-1

नहीं तुम सिर्फ

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

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

नहीं है, वहाँ नहीं है कर सकता है। देर से बाध्य भाषाओं में सम्मेलन जब यह स्थिति होती है (जैसा कि यह वैध रूप से हो सकता है, लेकिन यह देखने के लिए कि क्या यह विधि कहीं और स्थानांतरित की जा सकती है, शायद इसकी अमूर्त कक्षा में), अपवाद उठाना है, और यह सुनिश्चित करना है कि उसके उपयोगकर्ता विधि पता है कि कुछ कार्यान्वयन उस अपवाद को बढ़ा सकते हैं।

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