重载运算符<<在派生类

时间:2015-11-06 23:13:21

标签: c++ inheritance operator-overloading pure-virtual

假设我有两个类,其中一个是抽象的,另一个是另一个真正的派生子。它们都超载了operator <<函数。我该如何称呼抽象类&#39;来自派生类的操作员&#39;重载功能?

设置:

class Parent {
    virtual void open() = 0;
    friend std::ostream& operator << (std::ostream& out, const Parent& instance);
};

class Derived : public Parent {
    void open();
    friend std::ostream& operator << (std::ostream& out, const Derived& instance);
};

std::ostream& operator << (std::ostream& out, const Derived& instance) {
    out << "derived ";
    out << instance; // how can I call the function in the parent class here?
}

我已尝试将实例静态转换为父类,但您显然不能,因为它是一个抽象类,无法实例化。 out << static_cast<Parent>(instance);说&#34;错误:抽象类的演员&#39;父母&#39;是不允许的。&#34;

我也尝试过调用Parent::operator<<(out, instance),但因为它是朋友功能,所以从技术上来说它不是Parent的成员函数。

所以我没有想法......有谁知道这是否可以做到?调用这个函数的语法是什么?欢呼声。

2 个答案:

答案 0 :(得分:4)

有两种方法可以多态地执行此操作:

  • 使用明确的演员或
  • 调用<<班级的Parent
  • 将虚拟成员函数设计为Parent以进行格式设置,并为<<提供Parent的单一重载。

以下是第二种方法的说明:

class Parent {
    virtual void open() = 0;
protected:
    virtual std::ostream&  format(std::ostream& out) const {
        out << "hello" << endl;
        return out;
    }
    friend std::ostream& operator << (std::ostream& out, const Parent& instance);
};

class Derived : public Parent {
    void open();
    std::ostream&  format(std::ostream& out) const override {
        out << "derived" << endl;
        return Parent::format(out);
    }
};

std::ostream& operator << (std::ostream& out, const Parent& instance) {
    // Forward the call to a virtual member function
    return instance.format(out);
}

由于format(std::ostream&)现在是一个成员函数,派生类可以以他们认为合适的任何方式自由地覆盖它,或者依赖于基类的实现。

答案 1 :(得分:1)

这是您需要进行类型转换的地方。

std::ostream& operator << (std::ostream& out, const Derived& instance)
{
     out << "derived ";
     out << (const Parent &)instance;    // Alternative 1: C style cast
     out << static_cast<const Parent &>(instance);   // Alternative 2
     return out;
}