2016-04-11 19 views
0

'dan temel sınıftaki korumalı değişkene erişmek neden sorunlu Aşağıdaki parçacık beni şaşırtmış hissettiriyor. Der._x ++ neden doğrudur? Türetilmiş argümandan kopyalanan geçici bir yerel değişken olduğu için. Sadece halka üyelere erişilebilir olmalıdır. yorumlanmış ifade bs._x ++, hangisinin doğru olması gerektiğini geçemiyor. Lütfen yanlış anladığım yeri bildirin! Şimdiden teşekkür ederim!türetilmiş örnek

Nazik sorularınız için teşekkür ederiz. Ama benim şüphem der, argümandan kopyalanmış bir Türetilmiş nesnedir, başka bir deyişle, ilklendirilmiş Türetilmiş nesneyi kullanan bir müşteri olarak düşünülmelidir. Bu örnek değil, kopya oluşturucudan kaynaklanan başka bir geçici örnek değildir. _der aynı Derived sınıfın bir nesnedir ve Derived sınıf içinde gelen _x erişen çünkü

class Base 
{ 
public: 
    Base(int x, int y) :_x(x), _y(y){} 
protected: 
    int _x, _y; 
}; 

class Derived :public Base 
{ 
public: 
    Derived(int x, int y,int z) :Base(x,y), _z(z){} 
    void mem1(Base bs, Derived der) //copy constructor called. Derived::Derived(const Derived &) 
    { 
     der._x++; 
     //bs._x++; 
     _x++; 
    } 
private: 
    int _z; 
}; 

    int main() 
    { 
     Derived der(6,4,3), der1(5,3,2); 
     Base bs(-5,-4); 
     der1.mem1(bs, der); 
     return 0; 
    } 
+0

Çünkü dil bu şekilde çalışıyor. Erişim sadece bu kişinin örneğine değil. – WhozCraig

+0

'korumalı' tam olarak bunun için var. Korunan üyelere türetilmiş sınıflara erişilebilir, "özel" olamaz. –

+0

türetilmiş sınıfın üst sınıfın üye değişkenine erişmesini istiyorsanız, lütfen bunları özel olarak işaretleyin. –

cevap

0

der._x++erişilebilir olduğunu.

Bir sınıf içinde olduğunuzda, üyelerine (nesne başvurusuyla birlikte veya nesne referansı olmadan) erişebilirsiniz. Aksi (*this)._x

:) edilmez Ama dolayısıyla buna izin verilmez bs._x++ için böyledir başka bir sınıf için aynı yapamaz hangi de izin alınacaktır. Uygulama dilinin bu özelliğine dayanmaktadır. Ayrıca, Singleton'u unutmamak da mümkün değil (sınıfın içinden private constructor'u aradığınızda).