অবজেক্ট স্লাইসিং হলো যখন ডেরাইভড ক্লাস অবজেক্টকে বেস ক্লাস টাইপের ভেরিয়েবলে অ্যাসাইন/পাস করা হয়, তখন ডেরাইভড ক্লাসের এক্সট্রা মেম্বার (ডেটা/মেথড) "স্লাইস" হয়ে যাওয়া (হারানো)।
উদাহরণ
class Foo {
int a;
};
class Bar : public Foo {
int b; // ডেরাইভড ক্লাসে এক্সট্রা মেম্বার
};
// স্লাইসিং ঘটবে:
Bar bar;
Foo foo = bar; // bar-এর 'b' মেম্বার কপি হয়না, শুধু Foo অংশ কপি হয়
// foo এখন শুধু Foo অংশ ধারণ করে, Bar-র b হারিয়ে গেছে
কেন সমস্যা?
- পলিমরফিজম ভাঙে (ভার্চুয়াল ফাংশন কল করলে বেস ভার্সন কল হবে)
- ডেটা লস হয়
- সাবটাইল বাগ সৃষ্টি করে
প্রতিরোধ
- বেস ক্লাস রেফারেন্স/পয়েন্টার ব্যবহার করুন:
Foo& ref = bar;বাFoo* ptr = &bar; - বেস ক্লাসকে
abstractকরুন (পিউর ভার্চুয়াল ফাংশন দিয়ে) যাতে ইনস্ট্যান্সিয়েট করা যায় না। - C++-এ
deleteকপি কনস্ট্রাক্টর/অ্যাসাইনমেন্ট বেস ক্লাসে দিয়ে স্লাইসিং বাধা দিন।
Java-এ: সব অবজেক্ট রেফারেন্স দিয়ে ম্যানেজ হয়, তাই স্লাইসিং সমস্যা নেই (কিন্তু টাইপ কাস্টিং-এ সাবটাইল ইস্যু থাকতে পারে)।