2015-01-22 22 views
15

के बाहर बुलाया गया उदाहरण नीचे दिए गए उदाहरण में, B::f() क्यों कहा जाता है, भले ही यह निजी है?निजी समारोह सदस्य वर्ग

मुझे यह तथ्य पता है कि: उस ऑब्जेक्ट को इंगित करने के लिए उपयोग की जाने वाली अभिव्यक्ति के प्रकार का उपयोग करके कॉल पॉइंट पर एक्सेस की जांच की जाती है जिसके लिए सदस्य फ़ंक्शन कहा जाता है।

#include <iostream> 

class A { 
public: 
    virtual void f() { std::cout << "virtual_function"; } 
}; 

class B : public A { 
private: 
    void f() { std::cout << "private_function"; } 
}; 

void C(A &g) { g.f(); } 

int main() { 
    B b; 
    C(b); 
} 
+2

क्योंकि यह ए में सार्वजनिक है, संभवतः और इस तथ्य के कारण कि ए माता-पिता है और आप इसे किसी ऑब्जेक्ट से उपयोग कर रहे हैं, यह बच्चे पर दायरे की जांच करने से परेशान नहीं है, यह इस तथ्य से अतिरंजित है कि यह सिर्फ मेरे विचारों में सार्वजनिक है। – tom

+3

आपने जो कहा है, उसे समझाता है - 'सी' में 'जी' का स्थिर प्रकार 'ए 'है, और' एफ() '' ए' का सार्वजनिक सदस्य कार्य है। यह सब अभिगम नियंत्रण परवाह करता है। 'सी()' के पैरामीटर प्रकार को 'बी &' में बदलें और आपका कोड संकलित करने में विफल रहेगा। – Praetorian

उत्तर

23

मानक इसलिए कहते हैं क्योंकि:

[C++11: 11.5/1]: पहुँच नियम (क्लॉज 11) एक आभासी समारोह के लिए अपने घोषणापत्र द्वारा निर्धारित किया जाता है और एक समारोह है कि बाद में इसे ओवरराइड करता है के लिए नियमों से प्रभावित नहीं हैं। [उदाहरण:

class B { 
public: 
    virtual int f(); 
}; 
class D : public B { 
private: 
    int f(); 
}; 
void f() { 
    D d; 
    B* pb = &d; 
    D* pd = &d; 
    pb->f();  // OK: B::f() is public, 
       // D::f() is invoked 
    pd->f();  // error: D::f() is private 
} 

अंत उदाहरण]

उदाहरण तुम्हारा के रूप में ही, lol है।

4

संकलन समय C++ कम्पाइलर के दौरान कार्य करता है और तरीकों को अपने प्रकार के आधार पर की पहुंच पुष्टि करता है। फ़ंक्शन सी वैरिएबल जी प्रकार ए (कोड के संकलन के दौरान चेक किया गया) है, जिसमें विधि f को सार्वजनिक के रूप में घोषित किया जाता है।

एक आधार वर्ग से public आभासी कार्यों ओवरराइड कर सकते हैं this link

6

private कार्यों पर एक नजर डालें। पहुंच-योग्यता, एक वास्तव में, पूरी तरह से यह निर्धारित करते हुए एक समारोह के एक और ओवरराइड करता है कि क्या नजरअंदाज कर दिया है,

// Redundant private for clarity: 
class A { private: virtual void foo(); }; 
class B : A { public: void foo(); }; 

B::foo ओवरराइड A::foo में तो भी।

+2

यह उदाहरण बहुत दिलचस्प नहीं है, बशर्ते कि 'बी' ने' ए' की तरह 'foo' निजी घोषित किया है, _and_ इसे निजी रूप से विरासत में मिला है। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट समायोजित। – Columbo

+0

यह अभी भी निजी विरासत मिला है। क्या वह जानबूझकर है? यदि ऐसा है, तो वहां भी 'निजी' जोड़ने पर विचार करें? –

संबंधित मुद्दे