我遇到了通过运算符重载打印的问题。目前我正在创建一个包含Item类作为基类的数据库,Item中的派生类是Movie,Book和MusicAlbum。以下是图书如何插入图书馆的示例:
Item *item;
cout << ">>>>>> adding items to library:" << endl << endl;
item = library->addBook("The Curious Incident of the Dog in the Night-Time", "Mark Haddon", 240);
if (item != NULL) {
library->addKeywordsForItem(item, 2, "autism", "Asperger's Syndrome");
cout << item << endl;
}
其中addBook是类库中定义的函数,以及addKeywordsForItem。我的问题是这一行: cout&lt;&lt; item&lt;&lt; ENDL;
我知道我需要重载流&lt;&lt;运算符为了做到这一点,但我的主要功能(上面的代码来自哪里)包括添加电影和音乐专辑的类似功能。我重载流操作符的函数位于我的基类中,并接收基类指针作为参数,如下所示:
ostream& operator<<(ostream& out, const Item* item);
对于Book,我需要打印标题,作者,页数和关键字。对于电影和音乐专辑,也有特定的东西可以打印出来。
如何只使用基类中的一个重载流操作符的函数来打印我需要的任何信息?无论基类指针是指Book,Movie还是MusicAlbum的实例?提前谢谢。
答案 0 :(得分:2)
通常是将全局重载转发到虚函数:
struct Base {
virtual std::ostream &print(std::ostream &os) const {
return os << base_data;
}
};
struct Derived : Base {
virtual std::ostream &print(std::ostream *os) const {
return os << derived_data;
}
};
std::ostream &operator<<(std::ostream &os, base const &b) {
return b.print(os);
}
每个派生类将根据需要覆盖print
以将自身打印到流上。由于operator<<
通过引用获取Base
,因此它可以使用普通的虚拟分派根据它接收的对象的动态类型转发到正确类中print
的实现。 / p>