সি ++ তে একটি শ্রেণি একাধিক শ্রেণীর থেকে প্রত্যক্ষ (প্রত্যক্ষ বা পরোক্ষভাবে) উত্তরাধিকারী হতে পারে, যাকে একাধিক উত্তরাধিকার হিসাবে উল্লেখ করা হয়
।
সি # এবং জাভা যাইহোক, ক্লাসগুলি একক উত্তরাধিকারের মধ্যে ক্লাস সীমাবদ্ধ করে প্রতিটি শ্রেণি একক পিতা-মাতার ক্লাস থেকে উত্তরাধিকার সূত্রে আসে।
একাধিক উত্তরাধিকার হ'ল দুটি পৃথক শ্রেণীর শ্রেণিবিন্যাসের দিকগুলি একত্রিত করে এমন ক্লাস তৈরির একটি দরকারী উপায়, যা একক প্রয়োগের মধ্যে বিভিন্ন শ্রেণির কাঠামো ব্যবহার করার সময় প্রায়শই ঘটে।
যদি দুটি ফ্রেমওয়ার্কগুলি ব্যতিক্রমগুলির জন্য তাদের নিজস্ব বেস ক্লাসগুলি সংজ্ঞায়িত করে, উদাহরণস্বরূপ, আপনি ব্যতিক্রম কাঠামো তৈরি করতে একাধিক উত্তরাধিকার ব্যবহার করতে পারেন যা উভয় কাঠামোর সাথে ব্যবহার করা যেতে পারে।
একাধিক উত্তরাধিকারের সমস্যাটি এটি দ্ব্যর্থহীনতার দিকে নিয়ে যেতে পারে। ক্লাসিক উদাহরণটি যখন কোনও শ্রেণি অন্য দুটি শ্রেণির উত্তরাধিকার সূত্রে প্রাপ্ত হয়, যার প্রত্যেকটি একই বর্গ থেকে উত্তরাধিকার সূত্রে আসে:
class A {
protected:
bool flag;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
public:
void setFlag( bool nflag ){
flag = nflag; // ambiguous
}
};
এই উদাহরণে, flagডেটা সদস্য দ্বারা সংজ্ঞায়িত করা হয় class A। কিন্তু class Dথেকে বর্ষিত হয় class B
এবং class C, যা উভয় আহরণ থেকে A, ভব, যাতে দু কপি এর flagকারণ দুটি দৃষ্টান্ত পাওয়া যায় Aহয় Dএর বর্গ অনুক্রমের। আপনি কোনটি সেট করতে চান? কম্পাইলার অভিযোগ করবে রেফারেন্স flagমধ্যে Dহয় দ্ব্যর্থক । একটি সমাধান হ'ল সুস্পষ্টভাবে রেফারেন্সটি ছিন্ন করা:
B::flag = nflag;
আরেকটি সংশোধন হ'ল বি এবং সি হিসাবে ঘোষণা করা virtual base classes , যার অর্থ হ'ল শ্রেণীর মধ্যে কেবলমাত্র একটি অনুলিপি উপস্থিত থাকতে পারে, যে কোনও অস্পষ্টতা দূর করে।
অন্যান্য জটিলতা একাধিক উত্তরাধিকারের সাথে বিদ্যমান, যেমন ডেরাইজড অবজেক্টটি নির্মাণের সময় বেস ক্লাসগুলি সূচনা করার ক্রম হিসাবে, বা উপায়গুলি সদস্যরা অযাচিতভাবে উত্পন্ন শ্রেণি থেকে গোপন করা যেতে পারে। এই জটিলতাগুলি এড়াতে কিছু ভাষাগুলি নিজেকে সহজ একক উত্তরাধিকারের মডেলের মধ্যে সীমাবদ্ধ করে।
যদিও এটি উত্তরাধিকারকে যথেষ্ট সরল করে তোলে, এটি এর উপযোগিতাও সীমাবদ্ধ করে কারণ একটি সাধারণ পূর্বপুরুষের সাথে কেবল শ্রেণিগুলি আচরণগুলি ভাগ করতে পারে। ইন্টারফেসগুলি এই অংশীদারি কিছুটা কমিয়ে দেয় বিভিন্ন শ্রেণিবদ্ধ শ্রেণীর ক্লাসগুলিকে সাধারণ ইন্টারফেসগুলি প্রকাশ করার অনুমতি দেয় যদিও তারা ভাগ করে নেওয়ার কোড প্রয়োগ না করে।