在派生 class 中重载运算符 <<

Overloading operator << in derived class

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

设置:

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?
}

我试过将实例静态转换为父实例 class,但你显然不能,因为它是一个抽象的 class,无法实例化。 out << static_cast<Parent>(instance); 说 "error: a cast to abstract class 'Parent' is not allowed."

我也试过调用 Parent::operator<<(out, instance),但因为它是友元函数,所以严格来说它不是 Parent 的成员函数。

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

这是你需要类型转换的地方。

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

有两种多态的方法:

  • 调用 Parent class 的 << 显式转换,或
  • 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&) 现在是一个成员函数,派生的 classes 可以自由地以他们认为合适的任何方式覆盖它,或者依赖于基础 class 的实现。