覆盖派生类的>>运算符

Overwriting the >> operator for derived classes

本文关键字:gt 运算符 派生 覆盖      更新时间:2023-10-16

我正在编写一个程序,它要求我们重载Employee类的>>以便在使用它时读取正确的Employee类型所以我在主程序中有这样的内容:

 Employee *emp;
 empIn >> emp;

我认为基类是我想要做的,因为它是唯一一个适用于所有派生类的。该类型由行首的整数确定,因此我认为这样做可能会起作用(因为我在阅读之前不知道类型):

istream &operator >> (istream &stream, Employee &emp)
{
   int type;
   stream >> type;
   switch(type){
      case 1:
         *emp = new Hourly;
         break;
           ...
   }
   return stream;
}

但是,它不起作用。我这样做对吗?如果没有,请给我指出正确的方向。

问题似乎是您混合了引用和指针。在operator>>函数中,您接收emp作为引用,但将其作为指针访问,这是错误的。

为了整个事情的工作,emp对象需要在您尝试输入它之前分配。你不能在函数内部分配它。

Employe emp;
empIn >> emp;

Employe *emp = new Employe;
empIn >> *emp;

当然,不要在函数内部使用new

编译器应该给你很多错误,你应该先检查一下他们说什么。

istream函数的第二个参数应该是Employee* &emp,如果您希望能够像您的示例使用一样分配给指针。然后,该类型将是对指针的引用,这使您可以根据需要对其进行赋值,而不是对方法进行赋值。