【问题标题】:How can i overload operator as virtual如何将运算符重载为虚拟
【发布时间】:2019-10-17 23:22:14
【问题描述】:

我有一个简单的继承结构:

  • 基础
  • 基础

我想重载 > 运算符来输入和打印对象 Derived1Derived2 类中的数据作为对 Base 类的引用。

我可以声明某种虚函数吗?像这样:

virtual std::ostream& operator<<(std::ostream& os, const Base& obj) = 0;
virtual std::istream& operator>>(std::istream& is, Base& obj) = 0;

在我的Base 类中,并在Derived1Derived2 类中覆盖它们?

我想做一些类似的事情:

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);

【问题讨论】:

  • std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const Base&amp; obj) = 0; 重载 operator &lt;&lt;std::ostream 类,而不是 Base 类。如果你有这个想法,答案就会很清楚。
  • @AlgirdasPreidžius,我知道。但我仍然想获得该运算符的重载版本,我可以在基类引用中调用
  • 嗯,看起来不错。你试过了吗?你有什么错误吗?

标签: c++ operator-overloading virtual


【解决方案1】:

只有成员函数可以是虚函数,但这些 operator&lt;&lt;operator&gt;&gt; 不能是类的成员函数,因为它们的第一个参数是流,而不是重载这些运算符的类。

您可以为您的类重载operator&lt;&lt;operator&gt;&gt; 适配器函数,将调用转发到您的类的相应虚函数(第二个参数):

#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); }

【讨论】:

  • 哇!它非常漂亮..谢谢
  • 这是我使用的技术,虽然我称它们为printinput。 (sniff 我闻到 BASIC 的味道。)我还制作二进制 writeread,以及诊断 debug
猜你喜欢
  • 2011-09-08
  • 2021-11-12
  • 2019-10-21
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2015-08-08
相关资源
最近更新 更多