2014-01-29 80 views
-2

當我在Sub::f()並嘗試訪問Base* b指針指向的另一個子類的受保護成員時,它將不會編譯,直到Sub是Base的一位朋友。爲什麼我需要這樣做?爲什麼需要成爲訪問受保護成員的朋友?

class Base{ 
//friend class Sub; 
protected: 
    int i; 
    virtual void f() = 0; 
}; 

class Sub : public Base{ 
    Base* b; 
public: 
    Sub(Base* ba) : b(ba){} 
    void f(){ 
     b->f(); 
     cout << b->i << endl; 
    } 
}; 
+1

因爲這friend'是什麼'的。 – Maroun

+8

,因爲你只能讓你的朋友觸摸你的私人部分。 –

+0

@ user2310289 LOL – Maroun

回答

0

保護成員可以在自己的類和派生類中訪問,但不能在類之外訪問,所以如果您想要這樣做,請使用'friend'。而且由於CPP提供的這個功能,CPP不是'完全或完全的'面向對象的編程語言(漏洞),因爲我們可以在朋友的幫助下訪問私有成員。

1

protected只能在層次進行訪問,但如果你想例外,交朋友是這樣的。

朋友類可以訪問類的成員privateprotected

0

b->f()b->i不是在訪問f和他自己的基地b,但別人基地(一個由b指出)

sub base 
|____b_|___i___| 
    | 
    |_ 
     | 
     V 
sub base 
|____b_|___i___| 
+0

Thx;)這是一個很好的圖片。 – Daniel

相關問題