假设我有两个类,其中一个是抽象的,另一个是另一个真正的派生子。它们都超载了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
的成员函数。
所以我没有想法......有谁知道这是否可以做到?调用这个函数的语法是什么?欢呼声。
答案 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;
}