سؤال

لنفترض أن لدي مجموعة من المؤشرات لفئة مجردة:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top