派生类中的重载运算符 <<

Nos*_*All 0 c++ inheritance operator-overloading pure-virtual

假设我有两个类,其中一个是抽象类,一个是另一个真正的派生子类。它们都在重载operator <<函数。如何从派生类的重载函数中调用抽象类的运算符?

设置:

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?
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试将实例静态转换为父类,但显然不能,因为它是一个抽象类并且无法实例化。out << static_cast<Parent>(instance);说“错误:不允许强制转换为抽象类‘父’。”

我也试过调用Parent::operator<<(out, instance),但因为它是一个友元函数,所以从技术上讲它不是Parent.

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

das*_*ght 6

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

  • 调用<<了的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);
}
Run Code Online (Sandbox Code Playgroud)

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