brf*_*rfh 2 c++ virtual operator-overloading
我有一个简单的继承结构:
我想重载<<和>>运算符以输入和打印对象Derived1和Derived2类中的数据,作为对Base类的引用。
我可以声明某种虚函数吗?像这样 :
virtual std::ostream& operator<<(std::ostream& os, const Base& obj) = 0;
virtual std::istream& operator>>(std::istream& is, Base& obj) = 0;
Run Code Online (Sandbox Code Playgroud)
在我的Base班级中,并在Derived1和Derived2班级中覆盖它们?
我想做这样的事情:
std::vector<Base&> a;
... push reference to Derived1 and Derived2 objects ...
for (auto i = a.begin(); i != a.end(); ++i) std::cin >> (*i);
for (auto i = a.begin(); i != a.end(); ++i) std::cout << (*i);
Run Code Online (Sandbox Code Playgroud)
只有成员函数可以是虚拟的,但这些operator<<并operator>>不能成为你的类的成员函数,因为他们的第一个参数是一个流,而不是类重载这些操作符。
您可以为您的类重载operator<<和operator>>适配器函数,这会将调用转发到您类的相应虚函数中(第二个参数):
#include <iostream>
struct Base {
virtual std::ostream& output(std::ostream&) const = 0;
virtual std::istream& input(std::istream&) = 0;
virtual ~Base() = default;
};
inline std::ostream& operator<<(std::ostream& os, const Base& obj) { return obj.output(os); }
inline std::istream& operator>>(std::istream& is, Base& obj) { return obj.input(is); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |