首先,你必须声明你提取的朋友:
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