运算符<<在派生类 C++ 中

operator<< in derived classes c++

本文关键字:lt C++ 运算符 派生      更新时间:2023-10-16

我对派生类中的操作符<<有一个问题,例如:

如果我有

class Base
{
      //......
      friend ostream& operator<<(ostream& out,Base &B)
      {
          return  out<<B.x<<B.y<</*........*/<<endl;
      }
      //......    
};

是可能的吗?

class Derived: public Base
{
       //......
       friend ostream& operator<<(ostream& out,Derived &DERIVEDOBJECT)
       {
           return  out<<DERIVEDOBJECT<<DERIVEDOBJECT.nonderivedvar1 <</*.....*/<< endl;
       }
}

或将DERIVEDOBJECT放在<<操作符中不会导致<<将其识别为仅对基类的引用?

您通常需要这样的内容:

class Base { 
     virtual std::ostream &write(std::ostream &os) { 
         // write *this to stream
         return os;
     }
};
std::ostream &operator<<(std::ostream &os, Base const &b) { 
     return b.write(os); 
}

然后在必要时,派生类重写write

这将导致递归调用:

out<<DERIVEDOBJECT

我会这样做:

   friend ostream& operator(ostream& out,Derived &DERIVEDOBJECT)
   {
       return  out << static_cast<Base&>(DERIVEDOBJECT)
                   << DERIVEDOBJECT.nonderivedvar1
                   <<.....<< endl;
   }

p。空格和小写字母是你的朋友。
按照惯例,所有大写的标识符都是宏,所以如果对普通变量使用所有大写的标识符,可能会让人感到困惑。

您可以通过提升为基本类型来实现预期的结果:

struct base {};
std::ostream& operator<<( std::ostream& o, base const & b ) {
   return o << "base";
};
struct derived : base {};
std::ostream& operator<<( std::ostream& o, derived const & d ) {
   return o << static_cast<base&>(d) << " derived";
}
int main() {
   derived d;
   std::cout << d << std::endl; // "base derived"
}