在派生 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 的实现。
假设我有两个 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 的实现。