我如何重载虚拟操作员

问题描述 投票:0回答:1

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

  • Base
  • Base

我想重载<>运算符,以在对象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);
c++ operator-overloading virtual
1个回答
3
投票

仅成员函数可以是虚拟的,但是这些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); }
© www.soinside.com 2019 - 2024. All rights reserved.