Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ या Java में ऑब्जेक्ट स्लाइसिंग क्या है?


ऑब्जेक्ट स्लाइसिंग

ऑब्जेक्ट स्लाइसिंग तब होती है जब एक डेराइव्ड क्लास ऑब्जेक्ट को बेस क्लास ऑब्जेक्ट में वैल्यू द्वारा असाइन किया जाता है (कॉपी या असाइनमेंट द्वारा)। डेराइव्ड क्लास के विशिष्ट मेंबर्स (डेटा और फ़ंक्शन) "काट दिए जाते हैं", और केवल बेस क्लास का भाग रह जाता है।

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 ऑब्जेक्ट है)
}

परिणाम

  • डेटा हानि: डेराइव्ड क्लास के डेटा मेंबर्स खो जाते हैं।
  • पॉलीमॉर्फिज्म टूटता है: वर्चुअल फ़ंक्शन कॉल्स बेस वर्जन को हल करते हैं।
  • संसाधन प्रबंधन समस्याएं: यदि डेराइव्ड क्लास संसाधनों का प्रबंधन करती है (स्मार्ट पॉइंटर्स, फ़ाइल हैंडल), तो स्लाइसिंग डबल-फ्री या लीक का कारण बन सकती है।

रोकथाम

  1. पॉइंटर्स/रेफरेंस का उपयोग करें: `Base* ptr = &derived;` या `Base& ref = derived;` (पॉलीमॉर्फिज्म संरक्षित रहता है)।
  2. क्लोन पैटर्न: वर्चुअल `clone()` मेथड लागू करें जो डेराइव्ड टाइप की कॉपी लौटाता है।
  3. कॉपी/असाइनमेंट हटाएं: बेस क्लास में `Base(const Base&) = delete;` और `Base& operator=(const Base&) = delete;` घोषित करें।
  4. std::unique_ptr/shared_ptr: स्वामित्व और पॉलीमॉर्फिज्म के लिए स्मार्ट पॉइंटर्स का उपयोग करें।

Java में अंतर

Java में, सभी ऑब्जेक्ट्स रेफरेंस द्वारा एक्सेस किए जाते हैं (`Base b = new Derived();`)। इसलिए, **Java में ऑब्जेक्ट स्लाइसिंग नहीं होती**। हालाँकि, फील्ड शैडोइंग और मेथड ओवरराइडिंग नियम अभी भी लागू होते हैं।

  1. - जावा 9 में Cleaner क्लास का उपयोग क्या है?

    प्रोग्राम निष्पादन के दौरान बनाया गया एक ऑब्जेक्ट गार्बेज कलेक्टर (GC) द्वारा स्वचालित रूप से हटा दिया जाता है। जब कोई ऑब्जेक्ट किसी थ्रेड द्वारा रेफरेंस नहीं किया जाता और जब JVM निर्धारित करता है कि इस ऑब्जेक्ट तक पहुंचा नहीं जा सकता, तो यह गार्बेज कलेक्शन के लिए पात्र हो जाता है। Object क्लास में

  1. - Java में ARM क्या है?

    एक रिसोर्स एक ऑब्जेक्ट है जो AutoCloseable इंटरफ़ेस को इम्प्लीमेंट करता है। जब भी आप अपने प्रोग्राम में रिसोर्स का उपयोग करते हैं, तो उपयोग के बाद इसे बंद करने की सिफारिश की जाती है। प्रारंभ में, यह कार्य finally ब्लॉक का उपयोग करके किया जाता था। उदाहरण import java.io.File; import java.io.FileInp

  1. - जावा में ऑब्जेक्ट क्लोनिंग का उपयोग क्या है?

    ऑब्जेक्ट क्लोनिंग एक ऑब्जेक्ट की सटीक कॉपी बनाने का तरीका है। इस उद्देश्य के लिए, ऑब्जेक्ट क्लास के clone() मेथड का उपयोग ऑब्जेक्ट को क्लोन करने के लिए किया जाता है। जिस क्लास के ऑब्जेक्ट को क्लोन करना है, उसे Cloneable इंटरफेस को लागू करना होगा। यदि हम Cloneable इंटरफेस को लागू नहीं करते हैं, तो c