ऐसा इसलिए है क्योंकि यदि आपके किसी एक बेस में नाम मिलता है तो नाम लुकअप बंद हो जाता है। यह अन्य आधारों से परे नहीं दिखेगा। B में फ़ंक्शन A में फ़ंक्शन को छाया देता है। आपको B के दायरे में A के फ़ंक्शन को फिर से घोषित करना होगा, ताकि दोनों फ़ंक्शन B और C के भीतर से दिखाई दें:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
using A::foo;
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
संपादित करें: मानक विवरण वास्तविक विवरण देता है (10.2 / 2 से):
निम्नलिखित चरण एक वर्ग दायरे, सी। प्रथम में नाम देखने के परिणाम को परिभाषित करते हैं। सबसे पहले, कक्षा में नाम के लिए प्रत्येक घोषणा और इसके प्रत्येक आधार वर्ग में उप-वस्तुओं पर विचार किया जाता है। एक सब-ऑब्जेक्ट बी में एक सदस्य का नाम एफ, एक उप-ऑब्जेक्ट ए में एक सदस्य का नाम छुपाता है, यदि ए बी का एक आधार वर्ग उप-ऑब्जेक्ट है तो जो भी घोषणाएं छिपी हुई हैं, उन्हें विचार से समाप्त कर दिया जाता है। एक प्रयोग-घोषणा द्वारा पेश किए गए इन घोषणाओं में से प्रत्येक को C के प्रत्येक उप-ऑब्जेक्ट से माना जाता है, जो कि इस प्रकार का है, जो कि घोषणा-घोषणा -9 द्वारा निर्दिष्ट tion से युक्त है) यदि घोषित परिणाम निर्धारित नहीं हैं सभी एक ही प्रकार की उप-वस्तुओं से, या सेट में एक गैर-स्थैतिक सदस्य होता है और इसमें अलग-अलग उप-वस्तुओं के सदस्य शामिल होते हैं, एक अस्पष्टता होती है और कार्यक्रम बीमार होता है। अन्यथा वह सेट लुकअप का परिणाम है।
इसे किसी अन्य स्थान पर कहने के लिए निम्नलिखित है (इसके ठीक ऊपर):
एक आईडी-एक्सप्रेशन [ "फू" जैसा कुछ ] के लिए, नाम लुकअप इस के वर्ग दायरे में शुरू होता है; योग्य-आईडी के लिए [ "A :: foo", A एक नेस्टेड-नेम-स्पेसिफायर है ], नेस्टेड-नेम-स्पेसियर के दायरे में नाम लुकअप शुरू होता है। अभिगम नियंत्रण (3.4, खंड 11) से पहले नाम देखने की जगह लेता है।
([...] मेरे द्वारा डाला गया)। ध्यान दें कि इसका मतलब है कि भले ही बी में आपका फू निजी है, ए में फू अभी भी नहीं मिलेगा (क्योंकि अभिगम नियंत्रण बाद में होता है)।