यह एक स्पष्ट उत्तर या डुप्लिकेट के साथ एक प्रश्न हो सकता है। यदि हां, तो क्षमा करें, मैं इसे हटा दूंगा।डिज़ाइनरों को डिफॉल्ट कन्स्ट्रक्टर या विनाशकों की तरह "जंजीर" क्यों कॉपी नहीं किया जाता है?
प्रतिलिपि बनाने वाले कन्स्ट्रक्टर (डिफॉल्ट सीटीर्स या डाटर) की प्रतिलिपि क्यों नहीं बनाते हैं ताकि व्युत्पन्न वर्ग की कॉपी कन्स्ट्रक्टर को बुलाया जा सके, बेस क्लास की कॉपी कन्स्ट्रक्टर को बुलाया जाता है? प्रतिलिपि बनाने वाले और विनाशकों के साथ, उन्हें आधार-से-व्युत्पन्न और व्युत्पन्न-आधार पर क्रमशः श्रृंखला में बुलाया जाता है। प्रतिलिपि बनाने वालों के लिए यह मामला क्यों नहीं है? उदाहरण के लिए, इस कोड:
class Base {
public:
Base() : basedata(rand()) { }
Base(const Base& src) : basedata(src.basedata) {
cout << "Base::Base(const Base&)" << endl;
}
void printdata() {
cout << basedata << endl;
}
private:
int basedata;
};
class Derived : public Base {
public:
Derived() { }
Derived(const Derived& d) {
cout << "Derived::Derived(const Derived&)" << endl;
}
};
srand(time(0));
Derived d1; // basedata is initialised to rand() thanks to Base::Base()
d1.printdata(); // prints the random number
Derived d2 = d1; // basedata is initialised to rand() again from Base::Base()
// Derived::Derived(const Derived&) is called but not
// Base::Base(const Base&)
d2.printdata(); // prints a different random number
प्रतिलिपि निर्माता वास्तव में वस्तु की एक प्रति क्योंकि Derived::Derived(const Derived&)
basedata
उपयोग नहीं कर सकते इसे बदलने के लिए बनाने के (नहीं कर सकते हैं) नहीं है।
क्या कुछ मूलभूत है जो मैं प्रतिलिपि बनाने वालों के बारे में याद कर रहा हूं ताकि मेरा मानसिक मॉडल गलत हो या क्या इस डिजाइन के लिए कुछ आर्केन (या आर्केन) कारण नहीं है?
@ybungalobill ने दिखाया है कि यह संभव है, और काफी आसान है। मुझे लगता है कि आपका सवाल है "वे स्वचालित रूप से *** क्यों नहीं बंधे *** ***?" –
@AaronMcDaid हाँ, यह मेरा प्रश्न है, लेकिन इसका भी उत्तर –
@BenVoigt हाँ से नीचे दिया गया है, मैं सोच रहा था कि एक स्पष्ट रूप से लिखित एक स्पष्ट रूप से लिखित कन्स्ट्रक्टर की तरह क्यों नहीं है। लेकिन इस प्रश्न का उत्तर पहले ही दिया गया था –