C ++ فئة فرعية مستمدة من فئات مستمدة من نفس الفئة
-
25-09-2019 - |
سؤال
لماذا بنية الميراث التالية ليست شرعية في C ++؟
- SON1 مشتق من الأب 1
- SON2 مشتق من الأب 1
- حفيد 1 مستمد من SON1 و SON2
إذا كانت هناك حالة يكون فيها هذا شرعيًا (ربما إذا كانت جميع الفصول خالصة باستثناء الحفيد 1) ، فما هي وكيف تأتي؟
المحلول
أنت مخطئ ، هذا قانوني تمامًا في C ++. قد تنظر إلى الميراث الافتراضي رغم ذلك.
نصائح أخرى
يسمى هذا التسلسل الهرمي الميراث ماس الموت إنه قانوني في C ++ إذا كنت تستخدم الميراث الظاهري ، على الرغم من أنه لا يزال عادةً ما يكون مشكلة.
هذه هي مشكلة الماس C ++.
هذا هو الماس الميراث النموذجي. يحدث حتى في المكتبة القياسية حيث يستمد iostream من كل من ISTream و Ostream وكلاهما مستمرين من iOS_Base.
هناك العديد من القضايا:
إذا كان لدى الأب طريقة افتراضية وتنفيذ كل من SON1 و SON2 ، إلا إذا كان الحفيد ينفذها أيضًا ، فعليه أن يذكر أي من أساليب SON1 و SON2 التي ينفذها.
إذا كان لدى الأب أي أعضاء في البيانات ، فإن الحفيد سيحصل عليها مرتين.
على أي حال ، فإن الأب لديه طاولة V بحيث يبدو أنك تحصل على نسختين من ذلك.
لذلك عادةً ما تستخدم الطبقات الوسطى الميراث الافتراضي ، وهو أمر صعب ، ولكنه يعني بشكل فعال فقط الفئة النهائية تحصل على الفئة الأساسية. لذلك في هذه الحالة ، يعد حفيد نفسه مسؤولاً عن بناء الأب ويُفترض أنه "لديه".
هناك مشكلات أخرى للحذر إذا كنت ستقوم بإلقاء أي مؤشرات. كن حذرا بشكل خاص مع الصب من وإلى فراغ*.
أعتقد أنك مربكة التسلسل الهرمي للطبقة ومثال الطبقة.
يمكن لفئة "حفيد" مشتقة من فئة "الابن" ، لكن مثال على "حفيد" لا يمكن أن يكون من حالتين من الفصل "الابن"
في أي حالات ، أعتقد أنه يجب عليك ألا تفعل ذلك على هذا النحو لأنه في مرحلة ما سيكون لديك فئة "حفيد الحفيد" وطبقة "حفيد الحفيد".
اجعل سفينة العلاقة بين الآباء والأشقاء بطريقة أخرى.