首先,你必須聲明你提取的朋友:
class PhoneNumber
{
protected:
int area;
long number;
public:
...
friend istream& operator>>(istream& is, PhoneNumber &p);
};
你那麼類之外定義operator>>
:
istream& operator>>(istream& is, PhoneNumber &p)
{
cout << "Enter area code : ";
is >> p.area;
cout << "Enter number telephone number : ";
is >> p.number;
return is;
};
現在有了這個結構已經,您可以使用相同的operator>>
派生的IntPhoneNumber
,如果你不關心區域代碼:
struct IntPhoneNumber:public PhoneNumber
{
protected:
int reg;
public:
...
};
這段代碼可以編譯和處理IntPhoneNumber
完全一樣PhoneNumber
:
PhoneNumber n;
cout<< "Request phone number"<<endl;
cin >> n;
cout<< "Request phone int number"<<endl;
IntPhoneNumber ni;
cin>>ni;
現在,如果你想覆蓋運營商爲>>IntPhoneNumber
,而是重用你已經寫了PhoneNumber
,這也不是問題。只是定義另一個朋友和使用鑄造:
class IntPhoneNumber:public PhoneNumber
{
protected:
int reg;
public:
...
friend istream& operator>>(istream& is, IntPhoneNumber &p);
};
istream& operator>>(istream& is, IntPhoneNumber &p)
{
cout << "Enter area code : "; // do the specific
is >> p.reg;
return is >> static_cast<PhoneNumber&>(p); // and call the general one
};
這裏一個live demo on ideone應用此輸入和輸出。
備註:對於概念證明來說沒關係。但通常對於提取器過載(即operator>>
),您不應在cout
上顯示:如果使用相同的提取器從文件中讀取數據,屏幕將被用戶消息淹沒,讀取操作將會減慢。這就是爲什麼我在現場演示中添加了一些if (is==cin)
。
請標記語言和修復你的代碼的縮進。 – livibetter
在派生類中創建一個虛擬的'get(std :: istream&)'方法。爲基類創建一個非成員運算符重載插入器,並調用'p.get(is)'。在派生類中,您可以重寫該函數,以便您擁有不同的插入語義。 – 0x499602D2