जब आप अलग-अलग ऑब्जेक्ट्स को उसी तरह से संभालने की आवश्यकता होती है तो आप वर्चुअल फ़ंक्शंस का उपयोग करते हैं। इसे बहुरूपता कहा जाता है। मान लें कि आप कुछ आधार वर्ग है - शास्त्रीय आकार की तरह कुछ:
class Shape
{
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
class Rectange: public Shape
{
public:
void draw() { // draw rectangle here }
};
class Circle: public Shape
{
public:
void draw() { // draw circle here }
};
अब आप अलग अलग आकार के वेक्टर हो सकता है:
vector<Shape*> shapes;
shapes.push_back(new Rectangle());
shapes.push_back(new Circle());
और तुम इस तरह सभी आकृति आकर्षित कर सकते हैं:
for(vector<Shape*>::iterator i = shapes.begin(); i != shapes.end(); i++)
{
(*i)->draw();
}
इस तरह आप एक आभासी विधि - ड्रा() के साथ विभिन्न आकारों को चित्रित कर रहे हैं। विधि के उचित संस्करण को पॉइंटर के पीछे ऑब्जेक्ट के प्रकार के बारे में रन टाइम जानकारी के आधार पर चुना जाता है।
सूचना आप वर्चुअल कार्यों का उपयोग जब आप उन्हें के रूप में घोषणा कर सकते हैं शुद्ध आभासी (जैसे वर्ग आकार, बस जगह "= 0" विधि आद्य बाद में)। इस मामले में आप शुद्ध वर्चुअल फ़ंक्शन के साथ ऑब्जेक्ट का उदाहरण बनाने में सक्षम नहीं होंगे और इसे सार कक्षा कहा जाएगा।
भी विनाशक से पहले "वर्चुअल" नोटिस करें। यदि आप पॉइंटर्स के माध्यम से ऑब्जेक्ट्स के साथ अपने बेस क्लास में ऑब्जेक्ट्स के साथ काम करने की योजना बना रहे हैं तो आपको विनाशक वर्चुअल घोषित करना चाहिए, इसलिए जब आप बेस क्लास पॉइंटर के लिए "डिलीट" कहते हैं, तो विनाशकों की सभी श्रृंखला को बुलाया जाएगा और मेमोरी लीक नहीं होंगे।
स्रोत
2012-01-11 18:19:44
मैंने सिर्फ इस के लिए एक ब्लॉग पोस्ट बनाया है, क्योंकि मुझे एक बच्चे ने मुझसे पूछा कि "वर्चुअल फ़ंक्शंस" क्यों मुझे यह समझाना मुश्किल हो गया है? http://nrecursions.blogspot.in/2015/06/so-why-do-we-need-virtual-functions.html – Nav