首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承istream operator>>

继承istream operator>>
EN

Stack Overflow用户
提问于 2015-04-21 09:36:11
回答 2查看 172关注 0票数 2

我在PhoneNumber类中有一个函数:

代码语言:javascript
复制
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;
    }
};

类中的另一个函数如下所示:

代码语言:javascript
复制
class IntPhoneNumber::public PhoneNumber
{
    int reg;
    public 
    friend istream& operator>>(istream& is, IntPhoneNumber &p);
};

我希望IntPhoneNumber类继承并在PhoneNumber类中使用operator>>

EN

回答 2

Stack Overflow用户

发布于 2015-04-23 15:56:46

这样做的一种很好的可扩展性方法是从operator>>委托给PhoneNumber的虚拟成员函数,然后在派生类中提供重载-如果他们愿意,可以回调到父类中。

代码语言:javascript
复制
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);
}

现在你可以像这样重载:

代码语言:javascript
复制
class IntPhoneNumber::public PhoneNumber {
    int reg;
    virtual void getFromStream(istream& is) {
      PhoneNumber.getFromStream(is);
      cout << "Enter reg :";
      is >> reg;
    }
};
票数 2
EN

Stack Overflow用户

发布于 2015-04-22 03:12:15

首先,你必须声明你的提取器是朋友:

代码语言:javascript
复制
class PhoneNumber
{
protected:
    int area;
    long number;
public: 
    ...
    friend istream& operator>>(istream& is, PhoneNumber &p);
};

然后在类的外部定义了operator>>

代码语言:javascript
复制
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>>

代码语言:javascript
复制
struct IntPhoneNumber:public PhoneNumber
{
protected:
    int reg;
public:
    ...
};

这段代码将完全像PhoneNumber一样编译和处理IntPhoneNumber

代码语言:javascript
复制
PhoneNumber n;
cout<< "Request phone number"<<endl; 
cin >> n;  
cout<< "Request phone int number"<<endl; 
IntPhoneNumber ni; 
cin>>ni; 

现在,如果您想为IntPhoneNumber覆盖operator>>,但又想为PhoneNumber重用您已经编写的代码,这也不是问题。只需定义另一个朋友并使用强制转换:

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29761358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档