2012-08-16 11 views
7

Duplicar posible:
Why is it allowed to call derived class' private virtual method via pointer of base class?¿por qué puedo acceder al método privado desde afuera en C++?

Recientemente, me encontré con una pregunta extraña, PLZ consulte siguiente código:

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

y la salida es:

A disp 
B disp 

Me pregunto por qué el puntero b puede acceder a disp()? ¡Es privado! ¿No es así?

+0

No es para la clase a la que está accediendo a través de – fork0

+0

'A :: disp' es público; ese es el único 'disp' al que está accediendo el principal. –

Respuesta

7

disp() es público ya que lo está llamando a través de un A * y disp() se declara como público en A. Dado que es virtual, se llama a la versión de disp de B, pero eso no afecta si es público o privado.

1

Es por diseño del lenguaje. Sin embargo, es una mala práctica reforzar el nivel de protección de métodos al obtener

+2

También es una buena práctica declarar sus métodos virtuales heredados como 'virtual', en mi opinión. – Aesthete

+0

@Aesthete: de acuerdo. Más fácil de leer – Andrew

Cuestiones relacionadas