कॉपी कन्स्ट्रक्टर निजी बनाकर आप अनजान ऑब्जेक्ट स्लाइसिंग को रोकने में मदद करेंगे, जहां आप व्युत्पन्न वर्ग की एक प्रति बनाते हैं लेकिन उस व्युत्पन्न कक्षा के सभी गुणों को खो देते हैं। व्युत्पन्न कक्षाएं अपनी प्रतिलिपि बनाने वाले रचनाकारों को सार्वजनिक कर सकती हैं और सही काम कर सकती हैं।
एक ऐसा मामला है जहां कॉपी कन्स्ट्रक्टर को निजी के बजाय संरक्षित किया जाना चाहिए, जब सार वर्ग में डेटा सदस्य हों। यह अक्सर नहीं होता है। बेस क्लास बेस क्लास सदस्यों की प्रतिलिपि बना सकता है जबकि व्युत्पन्न वर्ग अपने सदस्यों की प्रतिलिपि बनाता है।
class AbstractBase
{
public:
AbstractBase(const std::string &init) : wtf(init) {}
virtual ~AbstractBase() {}
void DoSomething() = 0;
protected:
AbstractBase(const AbstractBase &r) : wtf(r.wtf) {}
const std::string wtf;
};
class Derived : public AbstractBase
{
public:
// ...
Derived(const Derived &r) : AbstractBase(r), moredata(r.moredata) {}
private:
int moredata;
};
स्रोत
2012-02-23 16:41:07
बेस क्लास कन्स्ट्रक्टर के लिए व्युत्पन्न वर्ग की एक प्रति बनाने के लिए असंभव है, इसलिए मुझे समझ में नहीं आता कि यह सार्वजनिक होने के लिए कब समझ जाएगा। –
@MarkRansom मेरा मतलब था [यह] (http://ideone.com/n2ndl), लेकिन लोग अभी भी व्युत्पन्न कक्षा में कॉपी कन्स्ट्रक्टर को कार्यान्वित कर सकते हैं। –
धन्यवाद मैंने ऐसा सोचा। एक अनुवर्ती प्रश्न, क्योंकि यह निजी है और इसका कभी भी उपयोग नहीं किया जाएगा, कॉपी कन्स्ट्रक्टर में कोई कोड होने की आवश्यकता नहीं है क्योंकि इसका कभी भी उपयोग नहीं किया जाएगा। क्या वो सही है? – Aaron