According to the C++ Standard
A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly cv-qualified) void.
You could use a virtual function that outputs data members or you could define operator << as pseudo-virtual (that is that calls a virtual function) for the classes.
For example
class parent
{
public:
virtual std::ostream & out( std::ostream &os ) const { return os << a; }
int a;
};
class son : public parent
{
public:
int b;
std::ostream & out( std::ostream &os ) const { return os << a + b; }
};
std::ostream & operator <<( std::ostream &os, const parent &obj )
{
return obj.out( os );
}