ভার্চুয়াল বেস ক্লাস ব্যবহার করা হয় যখন একটি প্রাপ্ত ক্লাসে বেস ক্লাসের একাধিক কপি থাকে।
উদাহরণ কোড
#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-এ দেওয়া আছে।