我在PhoneNumber类中有一个函数:
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>>。
发布于 2015-04-23 15:56:46
这样做的一种很好的可扩展性方法是从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;
}
};发布于 2015-04-22 03:12:15
首先,你必须声明你的提取器是朋友:
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;
};现在已经有了这个结构,如果您不关心区域代码,您可以对派生的IntPhoneNumber使用相同的operator>>:
struct IntPhoneNumber:public PhoneNumber
{
protected:
int reg;
public:
...
};这段代码将完全像PhoneNumber一样编译和处理IntPhoneNumber:
PhoneNumber n;
cout<< "Request phone number"<<endl;
cin >> n;
cout<< "Request phone int number"<<endl;
IntPhoneNumber ni;
cin>>ni; 现在,如果您想为IntPhoneNumber覆盖operator>>,但又想为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)。
https://stackoverflow.com/questions/29761358
复制相似问题