假设我有一个叫做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;
}
现在我试着动态演员,但没有奏效。在主
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;
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;
};
某处现在,这会给我的输出,仅由派生类变量(当你注释掉动态转换),但我也想有内容的基类。
对于多态性(和'dynamic_cast')工作,你需要使用*引用*的指针。尝试通过引用*将参数传递给输出运算符*。最好作为一个常量引用(分别是'const Shepherd&'和'const Dogs') –