वर्चुअल बेस क्लास का उपयोग तब किया जाता है जब एक व्युत्पन्न वर्ग में बेस क्लास की कई प्रतियां होती हैं।
उदाहरण कोड
#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 के मान को अधिलेखित कर देगा।