Чтобы решить эту проблему, я бы предпочел использовать перегрузку операторов для стандартного оператора «вывода» <<
и использовать виртуальные функции с цепочкой базового класса для получения вывода из родительских классов.
Возможно, что-то похожее на
#include <iostream>
class Animal
{
public:
virtual void output(std::ostream& out)
{
out << "output from the Animal class\n";
}
};
class Mammal : public Animal
{
public:
void output(std::ostream& out) override
{
Animal::output(out);
out << "output from the Mammal class\n";
}
};
class Elephant : public Mammal
{
public:
void output(std::ostream& out) override
{
Mammal::output(out);
out << "output from the Elephant class\n";
}
};
// Overload the output operator to call the correct function for output
std::ostream& operator<<(std::ostream& out, Animal const& animal)
{
animal.output(out);
return out;
}
int main()
{
Animal* animal = new Elephant;
std::cout << *animal;
delete animal;
}
Приведенный выше код должен напечатать
output from the Animal class
output from the Mammal class
output from the Elephant class
Это некоторое повторение, но не так много. И выполнение одной и той же вещи в нескольких местах обычно делает повторение неизбежным.