2012-08-16 19 views
7

Olası Çoğalt:
Why is it allowed to call derived class' private virtual method via pointer of base class?neden C++ uygulamasında dışarıdan özel yönteme erişebiliyorum?

Son

, ben plz aşağıdaki kodu bakın garip bir soru buluştu:

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

ve çıktısı:

A disp 
B disp 

İşaretçi b'nin neden disp'e erişebileceğini merak ediyorum()? Gizlidir! Öyle değil mi?

+0

Size A :: disp' herkese açıktır ' – fork0

+0

aracılığıyla erişiyor sınıf için değil kaynaklanan Ancak bu yöntemler koruma seviyesini güçlendirmek için kötü bir uygulamadır; Bu, ana erişimin sahip olduğu tek şeydir. –

cevap

7

disp(), bunu bir A * ile çağırdığınız için herkese açıktır ve disp(), A'da genel olarak bildirilir. Sanal olduğundan, B'nin B sürümü sürümü çağrılır, ancak bu durum kamu ya da özel.

1

Bu dil tasarım gereği bu.

+2

Ayrıca, kalıtımsal sanal yöntemlerinizi "sanal" olarak bildirmek iyi bir uygulamadır. – Aesthete

+0

@Aesthete: kabul etti. Okumak daha kolay – Andrew

İlgili konular