2016-11-25 70 views
2

假设我有一个叫做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; 
}; 

某处现在,这会给我的输出,仅由派生类变量(当你注释掉动态转换),但我也想有内容的基类。

+0

对于多态性(和'dynamic_cast')工作,你需要使用*引用*的指针。尝试通过引用*将参数传递给输出运算符*。最好作为一个常量引用(分别是'const Shepherd&'和'const Dogs') –

回答

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就足够了。

+0

谢谢,这样可以完成工作 – LinG

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; 
}; 
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.