ऑब्जेक्ट स्लाइसिंग
ऑब्जेक्ट स्लाइसिंग तब होती है जब एक डेराइव्ड क्लास ऑब्जेक्ट को बेस क्लास ऑब्जेक्ट में वैल्यू द्वारा असाइन किया जाता है (कॉपी या असाइनमेंट द्वारा)। डेराइव्ड क्लास के विशिष्ट मेंबर्स (डेटा और फ़ंक्शन) "काट दिए जाते हैं", और केवल बेस क्लास का भाग रह जाता है।
C++ में उदाहरण
class Base {
public:
int baseMember;
virtual void func() { std::cout << "Base\n"; }
};
class Derived : public Base {
public:
int derivedMember;
void func() override { std::cout << "Derived\n"; }
};
int main() {
Derived d;
d.baseMember = 1;
d.derivedMember = 2;
Base b = d; // स्लाइसिंग होती है!
// b में केवल baseMember है, derivedMember खो गया
// b.func() "Base" प्रिंट करेगा (वर्चुअल डिस्पैच काम नहीं करता क्योंकि b एक Base ऑब्जेक्ट है)
}
परिणाम
- डेटा हानि: डेराइव्ड क्लास के डेटा मेंबर्स खो जाते हैं।
- पॉलीमॉर्फिज्म टूटता है: वर्चुअल फ़ंक्शन कॉल्स बेस वर्जन को हल करते हैं।
- संसाधन प्रबंधन समस्याएं: यदि डेराइव्ड क्लास संसाधनों का प्रबंधन करती है (स्मार्ट पॉइंटर्स, फ़ाइल हैंडल), तो स्लाइसिंग डबल-फ्री या लीक का कारण बन सकती है।
रोकथाम
- पॉइंटर्स/रेफरेंस का उपयोग करें: `Base* ptr = &derived;` या `Base& ref = derived;` (पॉलीमॉर्फिज्म संरक्षित रहता है)।
- क्लोन पैटर्न: वर्चुअल `clone()` मेथड लागू करें जो डेराइव्ड टाइप की कॉपी लौटाता है।
- कॉपी/असाइनमेंट हटाएं: बेस क्लास में `Base(const Base&) = delete;` और `Base& operator=(const Base&) = delete;` घोषित करें।
- std::unique_ptr/shared_ptr: स्वामित्व और पॉलीमॉर्फिज्म के लिए स्मार्ट पॉइंटर्स का उपयोग करें।
Java में अंतर
Java में, सभी ऑब्जेक्ट्स रेफरेंस द्वारा एक्सेस किए जाते हैं (`Base b = new Derived();`)। इसलिए, **Java में ऑब्जेक्ट स्लाइसिंग नहीं होती**। हालाँकि, फील्ड शैडोइंग और मेथड ओवरराइडिंग नियम अभी भी लागू होते हैं।