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.
所以我没有想法......有谁知道这是否可以做到?调用这个函数的语法是什么?干杯。
有两种方法可以多态地执行此操作:
<<了的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&)现在是一个成员函数,派生类可以以任何他们认为合适的方式自由地覆盖它,或者依赖于基类的实现。