оператор << в производных классах c ++ - PullRequest
1 голос
/ 21 апреля 2011

У меня вопрос к оператору << в производных предложениях, например:

если у меня есть

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 в операторе << не приведет к << повторному вычислению его как ссылки только на базовый класс?

Ответы [ 3 ]

10 голосов
/ 21 апреля 2011

То, что вы обычно хотите, выглядит примерно так:

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, когда / при необходимости.

1 голос
/ 21 апреля 2011

Это вызовет рекурсивный вызов:

out<<DERIVEDOBJECT

Я бы сделал:

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

PS. Пробелы и строчные буквы - ваши друзья.
По соглашению, все идентификаторы в верхнем регистре являются макросами, поэтому вы можете запутать людей, используя все идентификаторы в верхнем регистре для обычных переменных.

0 голосов
/ 21 апреля 2011

Вы можете достичь ожидаемого результата путем увеличения до базового типа:

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"
}
...