如何使派生类的流操作符也输出基类

时间:2016-11-25 09:29:04

标签: c++ dynamic-cast

让我们说我有一个名为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;

现在这将给我一个只包含派生类变量的输出(当你注释掉动态转换时),但我也希望得到基类的内容。

3 个答案:

答案 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,因为您始终知道DogsShepherd的基类。只需使用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;
}

Here's a Wandbox link.