2010-01-26 33 views
7

Türetilmiş bir sınıf, bir Sınıf Tabanı'ndan özel olarak miras alınırsa ve Türetilmiş sınıf bir arkadaş işlevine f() sahipse, üyeler, Türetilmiş sınıf ve Temel sınıftan f() erişimlerini sağlayabilirler.Özel devralma ile türetilmiş sınıftaki arkadaş işlevi

class Base { 
public: 
    int a; 
protected: 
    int b; 
private: 
    int c; 
}; 


class Derived: private Base {  
    void friend f() {} 

public: 
    int d; 
protected: 
    int e; 
private: 
    int f; 
}; 

Bir sınıf temel sınıftan özel olarak miras ise, her şey türetilmiş sınıfta özel olduğunu anlıyoruz.

Ancak yukarıdaki kodda neden f() işlevi a, b, d, e, f işlevlerine erişebilir, ancak c değil?

cevap

9

'Arkadaşlık', arkadaşını bildiren sınıfa erişim izni verir - geçişli değil. Kötü bir benzetme kullanmak için - arkadaşlarımın mutlaka babamın arkadaşları değil.

+5

+1. –

+1

Bu örnekte benzerlik şöyle olacaktır: 'Evime arkadaşlarıma erişim izni vermem, babamın kendimi açamayacağımı garanti etmesine izin vermez' –

+0

@dribeas: Evet - sizin benzetiğiniz C++ davranışına daha yakındır. –

2

Özel üyeler türetilmiş sınıflara erişilebilir değil.

6

Derived bir arkadaşı erişebilirsiniz tam olarak ne Derived kendisi - o, Derived herhangi bir üyesi ve herhangi taban sınıfın her türlü kamu veya korumalı üye veya herhangi bir kamu veya korumalı büyük ebeveynli sınıfının fakat değil olduğunu Temel sınıfların özel üyeleri veya özel büyük ebeveyn sınıflarının üyeleri.

2

arkadaş fonksiyonu Türetilmiş tüm üyelerine erişebilir:

C++ SSS

biraz daha detay vardır. Taban'un Türetilmiş erişemediği herhangi bir üyeye erişimi yoktur. Türetilmiş Base :: c erişemiyor çünkü Base :: c özeldir. Benzetimi için

İlgili konular