为子类重载C++运算符 <<

4

我创建了一个名为Location的类,它是VillageCity类的父类。我有一个包含村庄和城市的vector<Location*>。现在,我需要将这个vector的内容输出到标准输出。这很简单:

    for (int i = 0; i < locations.size(); i++)
       cout << locations.at(i);

我已经为Village、City和Location类重载了运算符<<。它总是从Location类中的重载运算符<<中调用。我需要根据具体实例调用Village和City的重载运算符。是否有类似于虚方法的东西可以重载运算符? 我正在学习C++编程,我之前是Java开发者,请帮帮我。先谢谢了。

1
你肯定是指 vector<Location*>,否则我向你保证它不包含村庄和城市。 - StoryTeller - Unslander Monica
@StoryTeller 是的,你说得对,抱歉。 - PetrS
请展示运算符的签名;它们是成员函数还是全局函数? - Codor
在基类中创建一个虚方法用于输出。这个函数应该被派生类重写,并在operator<<()的实现中委托调用。 - David G
@0x499602D2 这是个好主意!谢谢,我会尝试的。 - PetrS
2个回答

8

简短回答

不存在这样的东西。您可以使用现有的C++特性来模拟它。

详细回答

您可以向Location添加一个方法virtual void Print(ostream& os),并像这样实现operator<<

std::ostream& operator<<(ostream& os, const Location& loc) 
{ 
    loc.Print(os); 
    return os; 
}

如果你在派生类中覆盖Print()函数,你将得到所需的功能。

那么我需要在我的 for 循环中调用 print() 方法吗? - PetrS
@PSglass 不是,你需要调用 operator<<() - David G
就像这样:cout << locations.at(i);?如果是的话,我尝试过了,它会打印对象的地址。 - PetrS

4

由于 operator<< 不能成为成员函数(而不改变其语义),因此您可以提供虚拟的 print 方法并进行双重派发。

class Location
{
  virtual void print (ostream&);
}

ostream& operator << (ostream& o, Location& l)
{
  l.print(o); // virtual call
  return o;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接