假设我有一个名为 dogs 的类并从该类继承了一个名为 shepherd 的类,现在我为我的基类重载了流运算符,但是现在当我为我的派生类重载流运算符时,我希望它也输出最初来 self 的基类的变量。
显然我可以复制粘贴用于重载基类流运算符的代码,但我一直在寻找一种更优雅的解决方案,它不涉及复制大量代码(特别是因为真实示例内部有更多变量基类)。
一个例子。
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;
现在这将给我一个仅包含派生类变量的输出(当您注释掉动态转换时),但我还想拥有基类的内容。
最佳答案
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
就足够了。
关于c++ - 如何让派生类的流式运算符也输出基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40801568/