2012-05-18 38 views
0

正如所說 - 「朋友不會繼承」。
這意味着友誼獲得繼承?奇怪的

class c 
{public: 
friend void i_am_friend(); 
}; 

class d:public c 
{public: 
// 
}; 

這裏無效i_am_friend()在d類是不能繼承。在更多的技術術語(我覺得這種方式。)

d類的對象將不會分配內存對於void i_am_friend(),因爲它是基類的朋友。
現在考慮問題編號。 14.3在本頁面 http://www.parashift.com/c++-faq/friends.html

class Base { 
public: 
    friend void f(Base& b); 
    ... 
protected: 
    virtual void do_f(); 
    ... 
}; 

inline void f(Base& b) 
{ 
    b.do_f(); 
} 

class Derived : public Base { 
public: 
    ... 
protected: 
    virtual void do_f(); // "Override" the behavior of f(Base& b) 
    ... 
}; 

void userCode(Base& b) 
{ 
    f(b); 
} 

這個代碼怎麼能是正確的?因爲

類派生d; // d不會有朋友功能
類基* B =&d; //因此b也沒有成員函數

因此,在這裏調用f(b)應該是錯誤的。

那麼,什麼是正確的說法: -
友誼是不會繼承
或友誼被繼承,但不能在派生類中使用

回答

2

的友誼是不會繼承

這是真的,即使在你的例子。 f(b)的調用不應該是一個錯誤,因爲Derived對象轉換爲Base&類型。

函數f只能訪問Base類的私有部分和受保護部分,但只能訪問Derived類的公共部分。