2014-01-06 47 views
0

我寫了下面的代碼:朋友的方法是行不通的

class Osoba{ 
private: 
    string imie, nazwisko, kolorOczu; 
    friend void Dziecko::coutall(); 
public: 
    Osoba(string imie, string nazwisko, string kolorOczu):imie(imie), nazwisko(nazwisko), kolorOczu(kolorOczu){}; 
    void coutall(){ 
     cout << "Imie: " << imie << endl; // 
     cout << "Nazwisko: " << nazwisko << endl; 
     cout << "Kolor oczu: " << kolorOczu << endl; 
    } 

}; 

class Dziecko: public Osoba{ 
private: 
    string nazwaPrzedszkola, choroba; 
    typedef Osoba super; 
public: 
    Dziecko(string imie, string nazwisko, string kolorOczu, string nazwaPrzedszkola, string choroba):super(imie, nazwisko, kolorOczu), nazwaPrzedszkola(nazwaPrzedszkola), choroba(choroba){}; 
    void coutall(){ 
     cout << super::imie; // this one gets underlined. 
     cout << "Nazwa przedszkola: " << nazwaPrzedszkola << endl; 
     cout << "Choroba: " << choroba << endl; 
    } 
}; 

這行帶有下劃線:

cout << super::imie; 

它說,它是不可訪問。但在我看來,這是 - 「友好」這種方法。 我嘗試了Dziecko類的前向聲明 - 也沒有工作。我究竟做錯了什麼?

回答

0

看來你不能調用該方法,因爲它使用類Osoba的私有成員。

嘗試使用imie作爲受保護的變量而不是私有。

這是一個短的explenation

提供的2個選項是:

1)friend整個類,而不是一個很好的做法使用繼承時。

2)使用受保護的成員。這是訪問私有成員繼承的最佳方式。

+0

OP期望'朋友'聲明來解決這個問題。所以問題是,爲什麼不呢? – juanchopanza

+0

頁面狀態'除非基類中的朋友聲明明確授予訪問權限,否則派生類不能使用基類的私有成員,這是OP似乎遇到的問題。 – Nbr44

+0

所以你說我應該朋友全班?所以不可能只派生一個派生類的一個方法? – tomdavies

0

你不能這樣做,因爲當Osoba被編譯時,Dziecko :: coutall沒有被定義,並且在C++中沒有任何方法可以進行成員方法聲明。相反,你可以交朋友所有Dziecko類(如Nbr44建議)

+0

這是正確的。但使整個班級的朋友看起來不像使用繼承的最佳做法... – Itzik984

+0

我同意。也許有必要在Osoba中提供將const ref返回給imie的受保護方法? – sliser