एक वर्ग पदानुक्रम पर विचार करें जहां A
बेस क्लास है और B
A
से निकला है।निहित प्रति कन्स्ट्रक्टर बेस क्लास कॉपी कन्स्ट्रक्टर को क्यों कॉल करता है और परिभाषित प्रति कन्स्ट्रक्टर नहीं करता है?
प्रतिलिपि निर्माता B
में परिभाषित नहीं किया गया है, संकलक एक संश्लेषण जाएगा। जब बुलाया जाता है, तो यह प्रतिलिपि निर्माता बेस क्लास कॉपी कन्स्ट्रक्टर (यहां तक कि संश्लेषित एक, अगर उपयोगकर्ता द्वारा कोई भी प्रदान नहीं किया गया है) को कॉल करेगा।
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
आउटपुट:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Copy constructor
उपयोगकर्ता B
में अपनी एक प्रतिलिपि निर्माता को परिभाषित करता है, तो जब लागू, इस प्रति निर्माता फोन करेगा आधार वर्ग डिफ़ॉल्ट निर्माता, जब तक के लिए एक कॉल बेस क्लास कॉपी कन्स्ट्रक्टर स्पष्ट रूप से मौजूद है (उदाहरण के लिए प्रारंभिक सूची में)।
#include <iostream>
class A {
int a;
public:
A() {
std::cout << "A::Default constructor" << std::endl;
}
A(const A& rhs) {
std::cout << "A::Copy constructor" << std::endl;
}
};
class B : public A {
int b;
public:
B() {
std::cout << "B::Default constructor" << std::endl;
}
B(const B& rhs) {
std::cout << "B::Copy constructor" << std::endl;
}
};
int main(int argc, const char *argv[])
{
std::cout << "Creating B" << std::endl;
B b1;
std::cout << "Creating B by copy" << std::endl;
B b2(b1);
return 0;
}
आउटपुट:
Creating B
A::Default constructor
B::Default constructor
Creating B by copy
A::Default constructor
B::Copy constructor
मेरा प्रश्न है, क्यों उपयोगकर्ता परिभाषित प्रतिलिपि निर्माता एक डिफ़ॉल्ट व्यवहार के रूप आधार वर्ग प्रति निर्माता फोन नहीं करता है?
यदि यह डिफ़ॉल्ट रूप से उस तरह से था, तो आप उस मामले को कैसे निर्दिष्ट करेंगे जहां आप ऐसा नहीं करना चाहते हैं? प्रारंभकर्ता सूची में – PlasmaHH
@PlasmaHH 'ParentClass()'। यह अभी भी बहुत असंगत और भ्रमित होगा जो मुझे विश्वास है। –
@ मार्कब: दरअसल, मैं उम्मीद कर रहा था कि वह इसके बारे में सोचते समय उसी निष्कर्ष पर आता है ... – PlasmaHH