c++ - 如何让派生类的流式运算符也输出基类

标签 c++ dynamic-cast

假设我有一个名为 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/

相关文章:

c++ - 如果没有单个虚函数,dynamic_cast 是否表现为 static_cast?

c++ - 自定义 GUI 对象

c++ - 使用动态转换为派生类中的变量返回不同的值

c++ - 构造函数内部 "this"的 dynamic_cast

c++ - g++ : Is there a way to access compile flags inside the code that is being compiled?

c++ - dynamic_cast 上的 SIGSEGV

c++ - 如何为模板类指定 "all parameterized types"或 "all argument lists"?

c++ - 如何在c++中实现这个数据结构

c++ - Visual Studio C++ : Debug Assertion Failed

c++ - 忽略某些颜色 Alpha 混合