Multiple inheritance in C++ | Diamond Problem

C++ এ একই সাথে একের অধিক ক্লাসকে inherit করা যায় অর্থাৎ multiple inheritance সুবিধা আছে। অসতর্ক থাকলে কোন কোন ক্ষেত্রে এই সুবিধাও অসুবিধার কারন হয়ে যেতে পারে। আর এই অসুবিধা এড়ানোর জন্য অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজ-ই multiple inheritance সাপোর্ট দেই না।  যারা জাভাতে কাজ করেছেন তাদের কাছে হয়ত multiple inheritance ব্যপারটাই নতুন।

যায় হোক, এই পর্বে আমরা multiple inheritance এর একটা অসুবিধা নিয়ে আলোচনা করব। এই সমস্যাকে Diamond problem, কখনও কখনও Deadly Diamond of Death বলা হয়। শুনতে ভয়াবহ রকম লাগছে! চলুন প্রথমে একটা কোড দেখা যাক

খুবই সহজ একটা কোড। মোট চারটা class । যার মধ্যে base ক্লাস এ একটি পাবলিক ভ্যারিয়েবল n । ক্লাস derived1 ও derived2 ইনহেরিট করেছে base ক্লাস কে। তার মানে derived1, derived2 তে একটা করে n এর কপি আছে। এখন ক্লাস derived3 একই সাথে derived1 ও derived2 কে ইনহেরিট করেছে। ঝামেলাটা এখানেই, Multiple inheritance এর কারনে এখন derived3 তে n এর দুইটা কপি আছে (derived1, derived2 প্রত্যেকের যেহেতু একটি করে)।

এখন আমি যখন derived3 এর অবজেক্ট d3 ক্রিয়েট করেছি, d3 তে n এর কপি আছে দুইটা। যখন আমি

d3.n = 5; লিখছি তখন কম্পাইলার আসলে বুঝতে পারছে না এটা কোন n ?

এটা কি derived1 নাকি derived2 এর n ? কম্পাইল করলে দেখতে পারবেন এরর টা এমন

error: request for number ‘n’ is ambiguous

এই সমস্যাটিকে চিত্রাকারে আকলে ডায়মন্ড এর মত দেখায়, তাই সমস্যাটি ডায়মন্ড প্রব্লেম নামে পরিচিত

multiple inheritance in c++

ডায়মন্ড সমস্যার সমধান

এই সমস্যার সমাধান দুই ভাবে করা যায়। আমি দুইটাই দেখাব। প্রথম সমাধান scope resolution operator ব্যবহার করে।

আমরা যখন n কে আক্সেস করব তখন এক্সপ্লিসিটলি বলে দিব কোন ক্লাস এর n । উদাহরন দেখলেই পরিষ্কার হবে ব্যপারটা। আমি মেইন ফাংশানকে পরিবর্তন করে লিখছি

এখানে n কে d3.derived1::n লিখে explicitly বোঝানো হয়েছে এটা derived1 ক্লাস এর n । এখন কম্পাইলার বুঝতে পারবে এবং কোন এরর ছাড়া কোড রান করবে। কিন্তু scope resolution operator সব সমস্যার সমধান দিতে পারে না। এমন যদি হয় আমার base ক্লাস এর একটি কপি-ই দরকার। তখন কিভাবে করব?

উত্তরটা খুব বেশি জটিল নয়। এই ক্ষেত্রে আমরা দ্বিতীয় পদ্ধতিতে করব, আর এই পদ্ধতি হল virtual base class এর ব্যবহার।

আমরা যদি derived1 ও derived2 কে base class এ ভার্টুয়াল ইনহেরিট করি তাহলে derived3 তে n এর মাল্টিপল কপি থাকবে না। একটা কপিই তৈরি হবে।

কোডটা এখন দেখতে হবে এমন

 

Print Friendly

মন্তব্য করুন

আপনার ই-মেইল এ্যাড্রেস প্রকাশিত হবে না। * চিহ্নিত বিষয়গুলো আবশ্যক।