我在寫一個涉及多態的C++程序。我需要重載運營商「< <」和「>>」爲友元函數。 我有基類基和3派生類:der1,DER2,der3和指向基礎類* p。如果我宣佈了功能朋友函數中基類參數類型的指針
istream &operator>>(istream &i,der1 &d1) {...}
istream &operator>>(istream &i,der2 &d2) {...}
istream &operator>>(istream &i,der3 &d3) {...}
,並呼籲他們喜歡
base *p;
p=new der1;
cin>>p;
程序無法編譯,因爲是用基地參數無功能。 但如果我宣佈它的話,它不會使任何區別,如果實際對象的類型爲der1,DER2或der3,但我希望它表現的不同取決於對象的類型。 我所能想到的只是在基礎中創建一個虛函數,並將其重載爲繼承類。但因此,我將不得不稱爲
*p>>cin
這看起來並不那麼自然。 我該如何解決這個問題?
那麼你聲明3個函數來引用,然後你使用一個指針調用一個函數;這將是一個不同的功能開始。是的,C++運行時無法查看您的基指針是否指向派生 - 多態性取決於「調用對象」,而不是參數對象。如果你說'p-> f()'* p中的代碼知道要調用什麼,但是在':: f(p)'中沒有內省* p並決定調用哪個f的代碼。該決定是在編譯時根據p的靜態標記進行的。 –
您是否嘗試過'cin >>(* p)'?您正將一個指針傳遞給期望參考的操作員。 – user2891462