1

这是一个家庭作业。

我有一个基类 Item 和一个派生类 Book。

我在 Item 类中重载了 op<<:

ostream& operator<<(ostream& out, const Item* const item)
{
    out << item->getName() << endl;
    return out;
}

以及在书类中:

ostream& operator<<(ostream& out, const Book* const b)
{
    out << b->getPages() << endl;
    return out;
}

但是,Item当我运行我的代码时,只使用了运算符,它不会打印一本书的页面。我已确保打印“书”,而不仅仅是基类。从我读过的材料看来,重载基类和派生类的运算符是你应该做的,所以我不确定为什么我的书信息没有被打印出来。

4

3 回答 3

3

您可以使用多态性而不是重载:向类添加虚拟打印方法:

class Item
{
 public:
  virtual void print(std::ostream& o) const
  {
    out << getName() << endl;
  }
 ....
};

class Book : public Item
{
 public:
  virtual void print(std::ostream& o) const
  {
    out << getPages() << endl;
  }
 ....
};

然后使用一个ostream& operator<<

ostream& operator<<(ostream& out, const Item& item)
{
    item.print(out);
    return out;
}

然后

Item* i1 = new Item(....);
Item* i2 = new Book(....);
std::cout << *i1 << " " << *i2 << std::endl;
delete i1;
delete i2;
于 2013-03-13T17:49:40.760 回答
1

如果您更改派生类函数的签名,它不再是基类成员函数的覆盖。

于 2013-03-13T17:48:27.863 回答
0

“但是,当我运行我的代码时,只使用了 Item 运算符” - 这种行为可能是因为您将它应用于基类上的指针 */reference&

如果您有一个容器,您想在其中存储从同一基类派生的不同类的实例并将其应用于所有这些类 operator<<,该行为将取决于每个实例的类调用它,您有确保:

1.您的基类中至少有一个虚拟方法(这将导致编译器为该类生成 虚拟表,稍后此表可以由operator dynamic_cast使用)
2.在您的项目中启用 RTTI(运行时类型识别) : project/c++/language 启用 RTTI 支持 3.使用以下思想实现 operator<< :

ostream& operator<<(ostream& out, const Item& item)
{
    if (Book* pBook = dynamic_cast<Book*>(&item)
    {
        out << pBook ->getName() << endl;
    }
    if (OtherDerivedClassName* pOtherDerivedClass = dynamic_cast<OtherDerivedClassName*>(&item)
    {
// do other interesting things
    }
    return out;
}
于 2013-03-13T18:23:01.623 回答