2016-11-25 5 views
2

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

Очевидно, что я мог бы скопировать код, используемый для перегрузки оператора потоковой передачи базового класса, но я искал более элегантное решение, которое не предполагало копирование большого количества кода (тем более, что реальный пример имеет намного больше переменных внутри базового класса).

пример.

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; 

Теперь это даст мне выход, который состоит только из производных переменных класса (если закомментировать динамический оттенок), но я также хотел бы, чтобы содержимое базового класса.

+0

Для полиморфизма (и 'dynamic_cast') для работы вам нужно использовать указатели * ссылки *. Попробуйте передать аргумент оператору вывода * по ссылке *. Предпочтительно в качестве постоянной ссылки (т. Е. 'Const Shepherd &' и 'const Dogs &', соответственно) –

ответ

1

dyanamic_cast работает только со ссылками и указателями, поэтому ваш код не может скомпилироваться. Вы должны изменить тип параметра на const &, причем не только для исправления ошибки, но и для исключения ненужной копии.

std::ostream &operator<<(std::ostream &os, const Dogs& dogs) 
std::ostream &operator<<(std::ostream &os, const Shepherd& shepherd) 
{ 
os << dynamic_cast<const Dogs&>(shepherd); 
... 

КСТАТИ: В этом случае static_cast будет достаточно.

+0

Спасибо, что выполняет эту работу – LinG

0

dynamic_cast здесь не требуется, так как вы всегда знаете, что Dogs является базовым классом Shepherd. Просто используйте static_cast:

std::ostream &operator<<(std::ostream &os, const Shepherd& shepherd) 
{ 
    os << static_cast<const Dogs&>(sheperd); 

    os << "The content of class shepherd" << std::endl; 
    os << shepherd.guarding << std::endl; 

    return os; 
}; 
0

Использование static_cast вместо; вы знаете базовый тип во время компиляции!

std::ostream &operator<<(std::ostream &os, Shepherd shepherd) { 
    os << static_cast<Dogs>(shepherd); 
    os << "The content of class shepherd" << std::endl; 
    os << shepherd.guarding << std::endl; 
    return os; 
} 

Here's a Wandbox link.