Проблема в том, что вы перегружаете operator<<
как функцию member .Это означает, что он может использоваться только как, например,
instance_of_B << std::cout;
, что переводится в
instance_of_B.operator<<(std::cout);
Если вы хотите перегрузить <<
как оператор вывода потока, это должен быть не -член-функция, и принять поток в качестве первого аргумента и A
(или производный) объект в качестве второго аргумента.
Чтобы обработать вывод, вы можете использовать виртуальныйФункция-член, которая делает это и которая вызывается функцией, не являющейся членом operator<<
.
Возможно, что-то вроде
class A
{
public:
...
// Inline definitions of friend functions makes the functions non-member functions
friend std::ostream& operator<<(std::ostream& os, A const& a)
{
return a.output(os);
}
protected:
virtual std::ostream& output(std::ostream&) = 0;
};
class B
{
...
protected:
std::ostream& output(std::ostream& os) override
{
return os << "Output from the B class\n";
}
};