वर्चुअल बेस क्लास का उपयोग तब किया जाता है जब एक व्युत्पन्न वर्ग में बेस क्लास की कई प्रतियां होती हैं।
उदाहरण कोड
#include <iostream> using namespace std; class B { public: int b; }; class D1 : public B { public: int d1; }; class D2 : public B { public: int d2; }; class D3 : public D1, public D2 { public: int d3; }; int main() { D3 obj; obj.b = 40; //Statement 1, error will occur obj.b = 30; //statement 2, error will occur obj.d1 = 60; obj.d2 = 70; obj.d3 = 80; cout<< "\n B : "<< obj.b cout<< "\n D1 : "<< obj.d1; cout<< "\n D2: "<< obj.d2; cout<< "\n D3: "<< obj.d3; }
उपरोक्त उदाहरण में, D1 और D2 दोनों ही B को इनहेरिट करते हैं, उन दोनों के पास B की एक ही कॉपी होती है। हालाँकि, D3 D1 और D2 दोनों को इनहेरिट करता है, इसलिए D3 में B की दो कॉपी होती हैं, एक D1 से और दूसरी D2 से।
उपरोक्त उदाहरण में कथन 1 और 2 त्रुटि उत्पन्न करेंगे, क्योंकि संकलक D3 में b की दो प्रतियों के बीच अंतर नहीं कर सकता।
D3 से B की कई प्रतियाँ निकालने के लिए, हमें B को D1 और D3 में वर्चुअल क्लास के रूप में इनहेरिट करना होगा।
तो, वर्चुअल बेस क्लास का उपयोग करने वाला उपरोक्त उदाहरण होगा -
उदाहरण कोड
#include<iostream> using namespace std; class B { public: int b; }; class D1 : virtual public B { public: int d1; }; class D2 : virtual public B { public: int d2; }; class D3 : public D1, public D2 { public: int d3; }; int main() { D3 obj; obj.b = 40; // statement 3 obj.b = 30; // statement 4 obj.d1 = 60; obj.d2 = 70; obj.d3 = 80; cout<< "\n B : "<< obj.b; cout<< "\n D1 : "<< obj.d1; cout<< "\n D2 : "<< obj.d2; cout<< "\n D3 : "<< obj.d3; }
आउटपुट
B : 30 D1 : 60 D2 : 70 D3 : 80
अब, D3 के पास B की केवल एक प्रति है और कथन 4, कथन 3 में दिए गए b के मान को अधिलेखित कर देगा।