2012-08-16 16 views
7

Eventuali duplicati:
Why is it allowed to call derived class' private virtual method via pointer of base class?perché posso accedere al metodo privato dall'esterno in C++?

Recentemente, ho incontrato una strana domanda, plz fare riferimento al seguente codice:

#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(); 
} 

e l'uscita è:

A disp 
B disp 

Mi chiedo perché il puntatore b può accedere a disp()? È privato! Non è vero?

+0

Non è per la classe che si sta accedendo tramite – fork0

+0

'A :: disp' è pubblico; questo è l'unico "disp" a cui accede l'accesso principale. –

risposta

7

disp() è pubblico poiché lo si chiama tramite A * e disp() è dichiarato pubblico in A. Poiché è virtuale, viene chiamata la versione B di disp, ma ciò non influisce sul fatto che sia pubblico o privato.

1

E 'un linguaggio design. Tuttavia è una cattiva pratica rafforzare il livello di protezione dei metodi quando si ottiene

+2

È anche una buona pratica dichiarare i metodi virtuali ereditati come "virtuali", secondo me. – Aesthete

+0

@ Estete: concordato. Più facile da leggere – Andrew

Problemi correlati