2010-01-26 112 views
7

如果一個Derived類是從一個Base類私下繼承而Derived類具有一個friend函數f(),那麼f()可以從Derived類和Base類訪問哪些成員。具有私有繼承的派生類中的朋友函數

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; 
}; 

我明白,如果一個類是從基類私下繼承的,那麼在派生類中一切都是私有的。

但是爲什麼在上面的代碼中,函數f()可以訪問a,b,d,e,f但不是c?

回答

9

'友誼'授予訪問聲明朋友的類 - 它不是傳遞性的。用一個不好的比喻 - 我的朋友不一定是我父親的朋友。

C++的常見問題有更詳細一點:

+5

+1類比。 – 2010-01-26 21:34:01

+1

這種情況下的比喻會更接近:「允許我的朋友進入我的房子不會允許他們訪問我父親的保障,我無法打開自己' – 2010-01-26 21:57:47

+0

@dribeas:是的 - 您的類比更接近於C++行爲。 – 2010-01-26 22:05:04

2

私有成員不能在派生類中訪問。

6

Derived的朋友可以訪問什麼Derived本身就可以 - 也就是Derived任何成員,任何基類的任何公共或受保護的成員,或任何公共或受保護的盛大父類的,但任何基類的私有成員或私有父母類的成員。

2

友元函數訪問派生的所有成員。它沒有訪問該衍生無法訪問基地的任何成員。派生不能訪問基地中:C因爲基地中:C是私人的。