ভার্চুয়াল বেস ক্লাস তখন ব্যবহৃত হয় যখন একটি ডেরাইভড ক্লাসের বেস ক্লাসের একাধিক কপি থাকে।
উদাহরণ কোড
#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; // স্টেটমেন্ট ১, এরর হবে
obj.b = 30; // স্টেটমেন্ট ২, এরর হবে
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 থেকে।
উপরের উদাহরণের স্টেটমেন্ট ১ এবং ২ এরর জেনারেট করবে, কারণ কম্পাইলার D3-তে b-এর দুটি কপির মধ্যে পার্থক্য করতে পারবে না।
D3 থেকে B-এর একাধিক কপি সরাতে, D1 এবং D2-এ 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; // স্টেটমেন্ট ৩
obj.b = 30; // স্টেটমেন্ট ৪
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-এর শুধু একটি কপি আছে এবং স্টেটমেন্ট ৪, স্টেটমেন্ট ৩-এ দিয়ে b-এর ভ্যালু ওভাররাইট করবে।