में "डालने" को कॉल कर रहे हैं क्योंकि इस मामले में बेस क्लास फ़ंक्शन ओवरलोड रिज़ॉल्यूशन में शामिल नहीं हैं। इसी तरह की स्थिति आंतरिक दायरे में घोषित कार्यों के साथ है - वे बाह्य दायरे में घोषित कार्यों को अधिभारित नहीं करते हैं (नीचे उदाहरण देखें)। आप कल्पना कर सकते हैं कि व्युत्पन्न वर्ग का दायरा बेस क्लास स्कोप के अंदर घोंसला है।
एक बार संकलक D::insert
उम्मीदवार पाया गया है कि यह बेस क्लास में आगे नहीं देखेगा। यदि D::insert
नहीं थे तो संकलक कॉल करने के लिए insert
विधि के लिए बेस क्लास देखेंगे। आप के साथ आधार वर्ग से insert
फ़ंक्शन नाम शुरू करने से इसे ठीक कर सकते हैं:
using B::insert;
इस व्युत्पन्न वर्ग में सभी B::insert
अतिभारित कार्यों का परिचय देंगे। कैसे अधिक भार कार्यों के लिए
d.B::insert(1)
नमूना कोड अन्य संदर्भों में एक ही तरह से:: या के रूप में आप कहते हैं, आप स्पष्ट रूप से आधार वर्ग विधि कॉल कर सकते हैं
namespace Outer {
void foo(double d) {
std::cout << "Outer::foo(double d)\n";
}
namespace Inner {
//using Outer::foo; // uncomment to see "Outer::foo(double d)" in output
void foo(int n) {
std::cout << "Inner::foo(int n)\n";
}
void callMe() {
foo(1.1);
}
}
}
int main() {
Outer::Inner::callMe(); // Outputes: Inner::foo(int n)
}
या:
void foo(std::string s) {
std::cout << "foo(std::string s)\n";
}
void foo(double d) {
std::cout << "foo(double d)\n";
}
void foo(int n) {
std::cout << "foo(int n)\n";
}
int main() {
void foo(int d); // comment out to see foo(double d) in output
foo(1.1); // outputs: "foo(int n)", foo(double d) is hidden
//foo("hello"); // ups, it wont compile - name lookup in c++ happens before type checking
// commenting out `void foo(int d);` above will fix this.
}
https://isocpp.org/wiki/faq/strange-inheritance#hiding-rule देखें – Oktalist