2011-12-01 46 views
0

訪問私有成員,這是我的代碼:不能使用基類朋友類

class Base 
{ 
    friend class SubClass; 
    int n; 
    virtual int getN() 
    { 
     return n; 
    } 
}; 

class SubClass: public Base 
{ 
public: 
    SubClass() {} 
    SubClass(const SubClass& s) {} 


}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SubClass s; 
    int x = s.getN(); 

    return 0; 
} 


error C2248: 'Base::getN' : cannot access private member declared in class 'Base' 

更重要的是我必須做的,從基本訪問我的私有成員?

回答

6

friend聲明意味着,​​獲得訪問它在​​範圍。

如果你想有一個類的用戶可以訪問的東西,在某些時候,你需要寫public:功能:

class SubClass : public Base 
{ 
public: 
    int getN() 
    { 
     return Base::getN(); 
    } 
}; 

你可以寫一個using聲明帶來了基類的功能到當前等級:

class SubClass : public Base 
{ 
public: 
    // getN is considered declared at this point now (in public) 
    using Base::getN(); 
}; 
+0

或'使用Base :: getN;',如果冗長不是你的東西。 –

+0

@MikeSeymour:哦,哦,讓我補充一點。 – GManNickG

1

main的代碼是不是要訪問​​方法,它試圖訪問一個Base方法 - 這就是爲什麼它不工作。

嘗試​​添加一個覆蓋:

virtual int getN() 
{ 
    return Base::getN(); 
} 
0

getN()從未公開,所以tmain()不能調用它。

讓一個子類成爲基類的朋友並不是正確的方法。這是對類型系統的混淆顛覆。如果你想從一個子類訪問一個基類的非公共成員,但沒有公開它們,就要保護它們。

2

爲什麼不只是宣佈nprotected