2015-04-21 37 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; 
    } 
};