2014-10-09 61 views
4

這是我第一次在這裏發表問題。爲什麼朋友類可以通過派生類訪問基類私人數據

class Base { 
    private: 
     int base; 
    friend class Question; 
}; 

class Derived : public Base{ 
    private: 
     int super; 
}; 

class Question{ 
    public: 
     void test(Base& base, Derived & derived) 
     { 
      int value1 =base.base; // No problem, because Question is a friend class of base 
      int value2 =derived.super; // Compile error, because Question is not a friend class of base 
      // Question is here 
      int value3 =derived.base; // No Compile error here, but I do not understand why. 
     } 
}; 

該問題在Class Question的最後一行中指出。

+1

'這裏沒有編譯錯誤,但我不明白爲什麼:這就是爲了讓朋友擺在首位的目的,那就是與他分享你的玩具。 – 101010 2014-10-09 21:19:59

+0

這是可行的,因爲即使實例恰好是派生值,成員仍然屬於基類。一般來說,這就是靜態類型檢查的工作原理 - 你可以將派生對象傳遞給一個函數,該函數通過引用接受基類,並且在該函數中進行類型檢查就像它是一個基本實例一樣完成,因爲實際類型不是'通常直到運行時才知道。 – Cameron 2014-10-09 21:22:34

回答

2

friend適用於該類型的所有成員,不管該類型是否被繼承。要強調這一點:它是共享的成員

這意味着您的Question職業可以訪問Base的所有會員,這僅僅是int Base::base。它是否通過Derived的實例訪問此成員是無關緊要的,因爲正在訪問的實際成員是在Base上聲明的。