2015-04-21 35 views
2

我有PhoneNumber類的函數:繼承istream的操作>>

class PhoneNumber 
{ 
protected: 
    int area; 
    long number; 
public: 
    istream& operator>>(istream& is, PhoneNumber &p){ 
     cout << "Enter area code : "; 
     is >> p.area; 
     cout << "Enter number telephone number : "; 
     is >> p.number; 
     return is; 
    } 
}; 

,並在課堂上的另一個功能是這樣的:

class IntPhoneNumber::public PhoneNumber 
{ 
    int reg; 
    public 
    friend istream& operator>>(istream& is, IntPhoneNumber &p); 
}; 

我想IntPhoneNumber類繼承和PhoneNumber類使用operator>>

+0

請標記語言和修復你的代碼的縮進。 – livibetter

+0

在派生類中創建一個虛擬的'get(std :: istream&)'方法。爲基類創建一個非成員運算符重載插入器,並調用'p.get(is)'。在派生類中,您可以重寫該函數,以便您擁有不同的插入語義。 – 0x499602D2

回答

1

首先,你必須聲明你提取的朋友:

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)

2

一個這樣做的很好的可擴展的方式是從operator>>委託的PhoneNumber虛成員函數,然後提供在派生類重載 - 這可能回調到父類,如果他們的願望。現在

class PhoneNumber { 
protected: 
    int area; 
    long number; 
public: 
    friend istream& operator>>(istream& is, PhoneNumber &p); 

    virtual void getFromStream(istream& is) { 
     cout << "Enter area code : "; 
     is >> area; 
     cout << "Enter number telephone number : "; 
     is >> number; 
    } 
}; 

istream& operator>>(istream& is, PhoneNumber &p) { 
    p.getFromStream(is); 
} 

你可以重載這樣的:

class IntPhoneNumber::public PhoneNumber { 
    int reg; 
    virtual void getFromStream(istream& is) { 
     PhoneNumber.getFromStream(is); 
     cout << "Enter reg :"; 
     is >> reg; 
    } 
};