覆盖<< C ++ 11中的operator,基类中的纯虚拟以及每个派生类中的不同实现

时间:2015-08-31 17:16:58

标签: c++ c++11

我有一个给定的基类,它有一些实现,并有两个派生类。我想覆盖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(也是一个字符串)的一部分,但这对我来说似乎不优雅,我希望有一个更直接的重写此运算符的方法,并在我的派生类中具有不同的实现。

[我只想补充一点,我对这个网站来说相对较新,虽然我试图正确地格式化和说明问题,但我确定存在一些错误,并且我感谢任何建设性的反馈和风格的编辑。]

1 个答案:

答案 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时,您就会获得动态调度。