【问题标题】:C++ Overloading operator << for child classesC++ 重载运算符 << 用于子类
【发布时间】:2014-05-07 11:24:26
【问题描述】:

我创建了一个类Location,它是类VillageCity 的父类。我有一个vector&lt;Location*&gt;,其中包含村庄和城市。现在,我需要将这个vector 的内容打印到标准输出。这很简单:

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

我为 VillageCityLocation 类重载了运算符 Location 类的重载运算符 Village 和City 调用重载运算符(取决于具体实例)。是否有类似用于重载运算符的虚拟方法之类的东西?

我是 C++ 编程新手,我正在使用 Java 编程,所以请帮助我。提前致谢。

【问题讨论】:

  • 当然你的意思是vector&lt;Location*&gt;,否则我向你保证它不包含村庄和城市。
  • @StoryTeller 是的,你是对的,对不起。
  • 请出示运营商签名;它们是成员函数还是全局函数?
  • 在基类中创建一个用于输出的虚方法。这个函数应该被派生类覆盖,并在operator&lt;&lt;()的实现中被委托给。
  • @0x499602D2 这是个好主意!谢谢,我试试看。

标签: c++ operator-overloading


【解决方案1】:

简答

不,没有这样的事情。您可以使用现有的 C++ 功能来模拟它。

长答案

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

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

如果您在派生类中覆盖 Print(),您将获得所需的功能。

【讨论】:

  • 然后我必须在 for 循环中调用 print() 方法?
  • @PSglass 不,你打电话给operator&lt;&lt;()
  • 就像这样:cout &lt;&lt; locations.at(i);?。如果是,我试过了,它会打印对象的地址。
【解决方案2】:

由于operator&lt;&lt; 不能成为成员函数(不改变其语义),您可以提供一个虚拟的print 方法并进行双重调度..

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 2021-05-14
    • 2011-11-29
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多