Предположим, что у меня есть класс, называемый собаками, и унаследованный от него, класс, называемый пастух, теперь я перегружаю оператор потоковой передачи для моего базового класса, но теперь, когда я перегрузите оператор потоковой передачи для моего производного класса, я бы хотел, чтобы он также выводил переменные, которые были первоначально из моего базового класса.Как сделать оператор потоковой передачи производного класса также вывести базовый класс
Очевидно, что я мог бы скопировать код, используемый для перегрузки оператора потоковой передачи базового класса, но я искал более элегантное решение, которое не предполагало копирование большого количества кода (тем более, что реальный пример имеет намного больше переменных внутри базового класса).
пример.
class Dogs
{
public:
int N_legs;
bool hair_short;
};
class Shepherd : public Dogs
{
public:
bool guarding;
};
std::ostream &operator<<(std::ostream &os, Dogs dogs)
{
os << "the content of class dogs" << std::endl;
os << dogs.N_legs << "\t" << dogs.hair_short << std::endl;
return os;
}
Теперь я пробовал динамический ролик, но это не сработало.
std::ostream &operator<<(std::ostream &os, Shepherd shepherd)
{
os << dynamic_cast<Dogs>(shepherd);
os << "The content of class shepherd" << std::endl;
os << shepherd.guarding << std::endl;
return os;
};
где-то в главном
Dogs dogs;
dogs.N_legs = 4;
dogs.hair_short = true;
std::cout << dogs << std::endl;
Shepherd shepherd;
shepherd.N_legs = 4;
shepherd.guarding = true;
std::cout << shepherd << std::endl;
Теперь это даст мне выход, который состоит только из производных переменных класса (если закомментировать динамический оттенок), но я также хотел бы, чтобы содержимое базового класса.
Для полиморфизма (и 'dynamic_cast') для работы вам нужно использовать указатели * ссылки *. Попробуйте передать аргумент оператору вывода * по ссылке *. Предпочтительно в качестве постоянной ссылки (т. Е. 'Const Shepherd &' и 'const Dogs &', соответственно) –