هل سيؤدي هذا إلى تقطيع الكائن؟
-
11-12-2019 - |
سؤال
لنفترض أن لدي مجموعة من المؤشرات لفئة مجردة:
Piece *pieces[2]; // where piece is an abstract class
ولدي فصلين يمتدان Piece
مُسَمًّى King
و Queen
.أخصص أ King
إلى مكان في pieces
و Queen
إلى مكان آخر:
pieces[0] = new King();
pieces[1] = new Queen();
إذا لم أقم بتحميل عامل التعيين بشكل زائد، فهل يحدث التقطيع؟أو لا pieces[0]
هو مثال على King
و pieces[1]
هو مثال على Queen
؟ما الذي يحدث في تلك المصفوفة (إذا كان هذا هو C++)؟
يحرر:شاهد مثالاً كاملاً للكود المعني هنا.
المحلول
هذا لا يجمع في الواقع:لا يمكنك تعيين أ King *
(نوع التعبير new King
) إلى أ Piece
(نوع التعبير *pieces[0]
).
للإجابة على سؤالك الضمني، على الرغم من:
Piece *piece = new King(); // fine, no slicing, just assigning a pointer
*piece = Queen(); // oops, slicing - assigning a Queen to a Piece
في المصفوفة الموجودة في سؤالك، على افتراض أنك كتبت pieces[0] = new King;
, وما إلى ذلك، فستقوم فقط بتخزين اثنين Piece
مؤشرات، واحدة منها تشير إلى أ King
وأحدها يشير إلى أ Queen
.
نصائح أخرى
لن يحدث أي تقطيع.أنت تقوم بتعيين المؤشر، وليس تعيين الكائنات.
نعم سيحدث التقطيع
سيحدث التقطيع دائمًا عندما تحاول وضع كائن فئة مشتقة على أي من فئته الأساسية.سيصبح هذا التقسيم مرئيًا إذا أضافت فئتك المشتقة بعض الوظائف التي لا توفرها فئتك الأساسية.
تذكر أن هذا هو الحال عندما لا تتبع مبادئ OOP.يقول مدير المدرسة،
"When you are deriving from any class you should not change the interface.
The reason for inheritance is moving from generic to specific type, and not
providing new functionality."
وإذا اتبعت هذا المبدأ، فيمكن تعريف سلوك التقطيع على النحو التالي:
“Moving from specific behaviour to more general behaviour”.
يعد تقطيع كائنات المؤشر مؤقتًا ويمكنك إعادة المؤشر إلى الفئة المشتقة للحصول على السلوك الأصلي.التقطيع عبر الكائن أمر دائم.
NOTE:- Slicing always does not happen in case of private inheritance.
If you try to do so it will result in compilation error.
(For more information on private inheritance:-http://stackoverflow.com/questions/19075517/object-slicing-in-private-inheritance/19083420?noredirect=1#19083420)