2012-08-16 8 views
7

संभव डुप्लिकेट:
Why is it allowed to call derived class' private virtual method via pointer of base class?मैं सी ++ में बाहर से निजी विधि का उपयोग क्यों कर सकता हूं?

हाल ही में, मैं, एक अजीब सवाल मुलाकात plz निम्नलिखित कोड का संदर्भ लें:

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
     virtual void disp() { 
      cout<<"A disp"<<endl; 
     } 

}; 

class B : public A 
{ 
    private: 
     void disp() { 
      cout<<"B disp"<<endl; 
     } 
}; 

int main() 
{ 
    A a; 
    a.disp(); 

    A *b = new B(); 
    b->disp(); 
} 

और आउटपुट है:

A disp 
B disp 

मुझे आश्चर्य है कि क्यों पॉइंटर बी disp() का उपयोग कर सकता है? यह निजी है! यही है ना

+0

प्राप्त करने के दौरान विधियों के संरक्षण स्तर को मजबूत करने के लिए यह एक बुरा अभ्यास है, यह उस वर्ग के लिए नहीं है जिसे आप – fork0

+0

'ए :: डिस्प' के माध्यम से एक्सेस कर रहे हैं; यह एकमात्र 'डिस्प' है जिसका मुख्य उपयोग है। –

उत्तर

7

disp() सार्वजनिक है क्योंकि आप इसे ए * के माध्यम से बुला रहे हैं और disp() को ए में सार्वजनिक घोषित किया जाता है क्योंकि यह वर्चुअल है, बी के संस्करण का विवाद कहलाता है, लेकिन इससे प्रभावित नहीं होता है कि यह सार्वजनिक या निजी।

1

यह भाषा डिज़ाइन द्वारा है। हालांकि

+2

मेरी राय में, अपनी विरासत वर्चुअल विधियों को 'आभासी' के रूप में घोषित करना भी अच्छा अभ्यास है। – Aesthete

+0

@ एस्थेट: सहमत हुए। पढ़ने के लिए आसान है – Andrew

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

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