سؤال

لماذا بنية الميراث التالية ليست شرعية في C ++؟

  • SON1 مشتق من الأب 1
  • SON2 مشتق من الأب 1
  • حفيد 1 مستمد من SON1 و SON2

إذا كانت هناك حالة يكون فيها هذا شرعيًا (ربما إذا كانت جميع الفصول خالصة باستثناء الحفيد 1) ، فما هي وكيف تأتي؟

هل كانت مفيدة؟

المحلول

أنت مخطئ ، هذا قانوني تمامًا في C ++. قد تنظر إلى الميراث الافتراضي رغم ذلك.

نصائح أخرى

يسمى هذا التسلسل الهرمي الميراث ماس الموت إنه قانوني في C ++ إذا كنت تستخدم الميراث الظاهري ، على الرغم من أنه لا يزال عادةً ما يكون مشكلة.

هذه هي مشكلة الماس C ++.

يرى: http://en.wikipedia.org/wiki/diamond_problem

هذا هو الماس الميراث النموذجي. يحدث حتى في المكتبة القياسية حيث يستمد iostream من كل من ISTream و Ostream وكلاهما مستمرين من iOS_Base.

هناك العديد من القضايا:

  • إذا كان لدى الأب طريقة افتراضية وتنفيذ كل من SON1 و SON2 ، إلا إذا كان الحفيد ينفذها أيضًا ، فعليه أن يذكر أي من أساليب SON1 و SON2 التي ينفذها.

  • إذا كان لدى الأب أي أعضاء في البيانات ، فإن الحفيد سيحصل عليها مرتين.

  • على أي حال ، فإن الأب لديه طاولة V بحيث يبدو أنك تحصل على نسختين من ذلك.

لذلك عادةً ما تستخدم الطبقات الوسطى الميراث الافتراضي ، وهو أمر صعب ، ولكنه يعني بشكل فعال فقط الفئة النهائية تحصل على الفئة الأساسية. لذلك في هذه الحالة ، يعد حفيد نفسه مسؤولاً عن بناء الأب ويُفترض أنه "لديه".

هناك مشكلات أخرى للحذر إذا كنت ستقوم بإلقاء أي مؤشرات. كن حذرا بشكل خاص مع الصب من وإلى فراغ*.

أعتقد أنك مربكة التسلسل الهرمي للطبقة ومثال الطبقة.

يمكن لفئة "حفيد" مشتقة من فئة "الابن" ، لكن مثال على "حفيد" لا يمكن أن يكون من حالتين من الفصل "الابن"

في أي حالات ، أعتقد أنه يجب عليك ألا تفعل ذلك على هذا النحو لأنه في مرحلة ما سيكون لديك فئة "حفيد الحفيد" وطبقة "حفيد الحفيد".

اجعل سفينة العلاقة بين الآباء والأشقاء بطريقة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top