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的最後一行中指出。
'這裏沒有編譯錯誤,但我不明白爲什麼:這就是爲了讓朋友擺在首位的目的,那就是與他分享你的玩具。 – 101010 2014-10-09 21:19:59
這是可行的,因爲即使實例恰好是派生值,成員仍然屬於基類。一般來說,這就是靜態類型檢查的工作原理 - 你可以將派生對象傳遞給一個函數,該函數通過引用接受基類,並且在該函數中進行類型檢查就像它是一個基本實例一樣完成,因爲實際類型不是'通常直到運行時才知道。 – Cameron 2014-10-09 21:22:34