एक वास्तविक समस्या का एक सरलीकृत संस्करण निम्नलिखित है। Base::operator=(int)
पर कॉल करने के बजाय, कोड अस्थायी Derived
ऑब्जेक्ट उत्पन्न करने के लिए प्रतीत होता है और इसकी बजाय प्रतिलिपि बनाता है। बेस असाइनमेंट ऑपरेटर का उपयोग क्यों नहीं किया जाता है, क्योंकि फ़ंक्शन हस्ताक्षर पूरी तरह से मेल खाता है? यह सरलीकृत उदाहरण किसी भी बीमार प्रभाव को प्रदर्शित नहीं करता है, लेकिन मूल कोड के विनाशक में दुष्प्रभाव होता है जो सभी प्रकार के विनाश का कारण बनता है।व्युत्पन्न कक्षा बेस क्लास ऑपरेटर = (असाइनमेंट ऑपरेटर) का उपयोग क्यों नहीं करती है?
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()\n";
}
Base(int)
{
cout << "Base(int)\n";
}
~Base()
{
cout << "~Base()\n";
}
Base& operator=(int)
{
cout << "Base::operator=(int)\n";
return *this;
}
};
class Derived : public Base
{
public:
Derived()
{
cout << "Derived()\n";
}
explicit Derived(int n) : Base(n)
{
cout << "Derived(int)\n";
}
~Derived()
{
cout << "~Derived()\n";
}
};
class Holder
{
public:
Holder(int n)
{
member = n;
}
Derived member;
};
int main(int argc, char* argv[])
{
cout << "Start\n";
Holder obj(1);
cout << "Finish\n";
return 0;
}
उत्पादन होता है:
Start
Base()
Derived()
Base(int)
Derived(int)
~Derived()
~Base()
Finish
~Derived()
~Base()
यह जानना अच्छा है! मुझे लगता है कि 'ऑपरेटर =' एकमात्र ऐसा है जो इस व्यवहार को प्रदर्शित करता है (रचनाकारों के लिए समझ में नहीं आता है और कोई अन्य कंपाइलर-जेनरेटेड विधियां नहीं हैं)। –
@ लचियनग्रिगोर, मुझे उम्मीद है! इसने हमें सभी प्रकार के सिर खरोंच के कारण बनाया, मैं फिर से इसमें भागना नहीं चाहता। –
एक-तर्क (सक्षम) रचनाकार लगभग हमेशा आपको 'स्पष्ट' टाइप करना चाहिए। –