我有一个给定的基类,它有一些实现,并有两个派生类。我想覆盖cout运算符<<有一个自定义的方法从这些类打印我想要的数据,每个派生类的方式略有不同。
class Base
{
public:
// Various functions, as expected
virtual friend std::ostream& operator<<(std::ostream& stream, const Base& base) = 0;
// More functions, members, all those things
}
这些是派生类中的实现:
class DerivedOne
{
public:
std::ostream& operator<<(std::ostream& stream, const Base& base)
{
stream << base._someData << "\t" << "first desired print statement: " << base._otherData;
}
class DerivedTwo
{
public:
std::ostream& operator<<(std::ostream& stream, const Base& base)
{
stream << base._someData << "\t" << "second desired print statement: " << base._otherData;
}
请注意,我调用的实际班级成员属于Base类,并且在两个实现之间不会有所不同。唯一改变的是数据成员之间的字符串。
This是我在Visual Studio上遇到的编译错误。似乎问题之一是&lt;&lt;运算符特别显示关键字&#34; friend,&#34;这使得它比其他运营商更复杂。
我想解决这个问题的方法之一是简单地将每个字符串保存为base._otherData(也是一个字符串)的一部分,但这对我来说似乎不优雅,我希望有一个更直接的重写此运算符的方法,并在我的派生类中具有不同的实现。
[我只想补充一点,我对这个网站来说相对较新,虽然我试图正确地格式化和说明问题,但我确定存在一些错误,并且我感谢任何建设性的反馈和风格的编辑。]
答案 0 :(得分:5)
可能的解决方案如下。将<<
运算符实现为调用虚拟成员函数的函数。
std::ostream& operator<<(std::ostream& stream, const Base& base) {
base.my_print_function(stream);
return stream;
}
然后使my_print_function
成为一个虚函数,在派生类中提供不同的实现。
您需要这样做的原因是,当您致电operator<<
时,动态调度不会被使用。通过这种方式实施,当operator<<
调用my_print_function
时,您就会获得动态调度。