मॉड्यूल पाठ (2/2)
बहुरूपता और आभासी कार्य
बहुरूपता हमें विभिन्न व्युत्पन्न वर्गों की वस्तुओं को एक सूचक या उनके आधार वर्ग के संदर्भ के माध्यम से इलाज करने की अनुमति देता है, यह सुनिश्चित करते हुए कि किसी विधि का सही संस्करण रनटाइम (लेट बाइंडिंग) पर कहा जाता है।
आभासी कार्य: virtual और override
किसी विधि पर बहुरूपता को सक्षम करने के लिए, हमें इसे बेस क्लास के अंदर virtual कीवर्ड का उपयोग करके घोषित करना होगा। व्युत्पन्न कक्षाओं में, हम स्पष्ट रूप से यह बताने के लिए override विनिर्देशक का उपयोग करते हैं कि हम उस पद्धति को ओवरराइड कर रहे हैं।
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};बेस क्लास के लिए पॉइंटर्स का उपयोग करके, C++ रनटाइम पर सही विधि का समाधान करेगा:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;सार कक्षाएं और शुद्ध आभासी कार्य
एक शुद्ध वर्चुअल फ़ंक्शन एक वर्चुअल सदस्य फ़ंक्शन है जिसे अंत में = 0 के साथ घोषित किया गया है। यह एक औपचारिक अनुबंध का प्रतिनिधित्व करता है: बेस क्लास कोई कार्यान्वयन प्रदान नहीं करता है, इसे पूरी तरह से उपवर्गों को सौंप देता है।
कम से कम एक शुद्ध आभासी फ़ंक्शन वाले वर्ग को सार वर्ग कहा जाता है और इसे सीधे प्रारंभ नहीं किया जा सकता है।
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};खुद कोशिश करना
एनिमल में एक वर्चुअल विधि makeSound() को परिभाषित करें जो 'कुछ ध्वनि' प्रिंट करती है। फिर 'म्याऊ' प्रिंट करने के लिए ओवरराइड विनिर्देशक का उपयोग करके इसे कैट क्लास में ओवरराइड करें।
संकेत दिखाएँ
बेस क्लास विधि में `वर्चुअल` को जोड़ना और व्युत्पन्न क्लास में पैरामीटर कोष्ठक के बाद `ओवरराइड` रखना याद रखें।
3 प्रयासों के बाद समाधान उपलब्ध है
एक शुद्ध वर्चुअल फ़ंक्शन प्रिंट() घोषित करें जो अमूर्त वर्ग प्रिंट करने योग्य के भीतर शून्य लौटाता है। फिर दस्तावेज़ वर्ग बनाएं जो सार्वजनिक रूप से प्रिंट करने योग्य से प्राप्त होता है और 'प्रिंटिंग दस्तावेज़' को प्रिंट करने के लिए प्रिंट() विधि लागू करता है।
संकेत दिखाएँ
एक शुद्ध वर्चुअल फ़ंक्शन को `वर्चुअल वॉयड प्रिंट() = 0;` हस्ताक्षर के साथ घोषित किया जाता है। सुनिश्चित करें कि `दस्तावेज़` सार्वजनिक रूप से `प्रिंट करने योग्य` से प्राप्त हुआ है।
3 प्रयासों के बाद समाधान उपलब्ध है