वर्चुअल बेस क्लास का उपयोग तब किया जाता है जब एक डेराइव्ड क्लास में बेस क्लास की कई कॉपीज़ होती हैं।
उदाहरण कोड
#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 की कई कॉपीज़ को हटाने के लिए, हमें D1 और D3 में B को वर्चुअल क्लास के रूप में इनहेरिट करना होगा।
तो, वर्चुअल बेस क्लास का उपयोग करके उपरोक्त उदाहरण होगा −
उदाहरण कोड
#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 के मान को ओवरराइट कर देगा।