我如何将运算符重载为虚拟
How can i overload operator as virtual
我有一个简单的继承结构:
- 基础 <- 派生 1
- 基础 <- 衍生 2
我想重载 << 和 >> 运算符以在对象 Derived1
和 Derived2
class 中输入和打印数据作为对 Base
class.
我可以声明某种虚函数吗?像这样:
virtual std::ostream& operator<<(std::ostream& os, const Base& obj) = 0;
virtual std::istream& operator>>(std::istream& is, Base& obj) = 0;
在我的 Base
class 中,并在 Derived1
和 Derived2
classes?
中覆盖它们
我想做一些类似的事情:
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);
只有成员函数可以是虚函数,但是 operator<<
和 operator>>
不能是你的 class 的成员函数,因为它们的第一个参数是流,而不是 class 重载这些运算符。
您可以为 class 重载 operator<<
和 operator>>
适配器函数,将调用转发到 class 的相应虚函数(第二个参数) :
#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); }
我有一个简单的继承结构:
- 基础 <- 派生 1
- 基础 <- 衍生 2
我想重载 << 和 >> 运算符以在对象 Derived1
和 Derived2
class 中输入和打印数据作为对 Base
class.
我可以声明某种虚函数吗?像这样:
virtual std::ostream& operator<<(std::ostream& os, const Base& obj) = 0;
virtual std::istream& operator>>(std::istream& is, Base& obj) = 0;
在我的 Base
class 中,并在 Derived1
和 Derived2
classes?
我想做一些类似的事情:
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);
只有成员函数可以是虚函数,但是 operator<<
和 operator>>
不能是你的 class 的成员函数,因为它们的第一个参数是流,而不是 class 重载这些运算符。
您可以为 class 重载 operator<<
和 operator>>
适配器函数,将调用转发到 class 的相应虚函数(第二个参数) :
#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); }