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