让我们说我有一个名为dog的类,并继承了它,一个名为shepherd的类,现在我为我的基类重载了流操作符,但现在当我为我的派生类重载流操作符时,我想它还输出最初来自我的基类的变量。
显然我可以复制粘贴用于重载基类流媒体操作符的代码,但我一直在寻找一种更优雅的解决方案,它不涉及复制大量代码(特别是因为真实的例子有很多基类内的变量。)
一个例子。
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 :(得分: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);
...
BTW:对于这种情况,static_cast
就足够了。
答案 1 :(得分: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;
};
答案 2 :(得分: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;
}