1

我在通过运算符重载打印时遇到问题。目前我正在创建一个数据库,其中包含一个 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 << item << endl;

我知道我需要重载流 << 运算符才能做到这一点,但我的主要功能(上面的代码来自哪里)包括用于添加电影和音乐专辑的类似功能。我用于重载流操作符的函数位于我的基类中,并接收一个基类指针作为参数,如下所示:

ostream& operator<<(ostream& out, const Item* item);

对于书,我需要打印标题、作者、页数和关键字。对于电影和音乐专辑,也有一些特定的东西可以打印出来。

如何仅使用基类中重载流式运算符的一个函数来打印我需要的任何信息?不管基类指针是否指向 Book、Movie 或 MusicAlbum 的实例?提前致谢。

4

1 回答 1

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根据它接收到的对象的动态类型转发到正确类中的实现。

于 2012-12-11T05:20:54.800 回答