2013-04-12 118 views
0

我有4個類。類和純虛擬

class Aclass Bclass CCclass D

類包括A類和B類和引用它們:

頭文件:

class C 
{ 
private: 
    A &a; 
    B &b; 
    int x; 
    int y; 
    int energy; 
public: 

    C(A &a, B &b); 

      void print(void); 

    virtual void printAt(void); 

CPP文件包括:

void C::printAt(void) 
{ 
    // move cursor to the current x, y coordinates 
    b.gotoXY(x,y); 
} 

D類,我做類C由(class D : public class C...

朋友類然後,我有一個void printAt(void)

這一切工作,但我怎麼訪問來自D類B類屬性(b.gotoXY..)?

希望這使得Sence。

+2

你不讓它_「朋友」 _,你從它繼承。 –

+2

請繼續閱讀[繼承](http://stackoverflow.com/a/860353/57318)和[public/protected/private access](http://stackoverflow.com/a/614844/57318)。我們可以爲你解答,但我擔心你不明白爲什麼。 – Xymostech

回答

0

只要把它們protected部分:

class C { 
protected: 
    A &a; 
    B &b; 

    ... 
}; 

注:它無關virtual方法。

0

您無法從D訪問它們的原因是因爲它們是private,這意味着它們只能從D本身內訪問。爲了能夠只從D或其子類訪問它們,你需要使用protected訪問修飾符來代替:

class C 
{ 
private: 
    int x; 
    int y; 
    int energy; 

protected: 
    A &a; 
    B &b; 

public: 
    C(A &a, B &b); 

    void print(void); 

    virtual void printAt(void); 
    /// ... 
}; 

現在,有些術語:

當你鍵入class C : public D你是不是使它成爲friend,你是從它繼承。這意味着C將是D的基類。朋友是另一個相關的概念。

一些類的一個朋友是訪問其private性質的類。因此,如果您改爲製作D a friendC,您將有權訪問ab,而無需將它們製作爲protected。這將實現這樣:

class C 
{ 
    // Some code... 
    friend D; 
    //Lots of code ... 
} 

請注意,這個工作,你需要C之前聲明D

現在,你應該使用哪個這些選項?

問自己這個問題:是D邏輯更具體的類型C?如果是這樣,它應該使用繼承。如果沒有,則可能會更好地使D擁有C類型的成員並使用friend關鍵字。在這兩種情況下,使用friend謹慎,並且僅當有一定的兩個類之間的非常緊密的關係(也許如果D是一家工廠爲C類型和C有一個私人的構造函數)。

0

你應該把預期的成員protected或者讓他們的班級friend到班上。

此外,我覺得當你從C實例化一個對象時,你會遇到問題,因爲未初始化的引用。

class C 
{ 
private: 
    A &a; 
    B &b; 

    // ... 

public: 
    C(A &a, B &b) : a(a), b(b) 
        ^^^^^^^^^^^^ 
    // ... 
}; 
0
如果要在繼承訪問您的屬性其他類

.dont私人他們
所以你可以選擇保護或公開。 更多的細節,你可以去http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/
用於解決問題的嘗試下面的代碼

class C 
{ 
protected://or public 
    A &a; 
    B &b; 
    int x; 
    int y; 
    int energy; 
public: 
    C(A &a, B &b); 
    void print(void); 
    virtual void printAt(void); 

class D

class D:public C 
{ 
public: 
    void printAt(void); 
};