多重继承的麻烦。如何调用基本功能?

时间:2012-11-05 12:38:58

标签: c++ multiple-inheritance diamond-problem

我正在学习C ++,在学校作业中我必须使用钻石结构,即使它不完全正确。

class Book
{
    public:
        virtual int getPurchasePrice() const;
    protected:
        int m_purchasePrice;
};
class AdultBook: virtual public Book{} ;
class ChildrenBook: virtual public Book{} ;
class ComicBook: public AdultBook, public ChildrenBook {} ;

(我删除了所有方法和构造函数以简化)

现在,如果我想创建一本漫画书并了解其购买价格,我该怎么办? 如果我在漫画书上执行了getPurchasePrice(),我会收到以下错误:

error: request for member 'getPurchasePrice' is ambiguous

我认为为ChildrenBook和AdultBook设置虚拟可以解决这种歧义吗?

2 个答案:

答案 0 :(得分:2)

您使用

obj->AdultBook::getPurchasePrice();

obj->ChildrenBook::getPurchasePrice();

obj->Book::getPurchasePrice();

适用于obj

类型的ComicBook

为Emilio Garavaglia编辑

假设你没有为成人和儿童书重新定义getPurchasePrice,你可以拥有这个

Key A - Adult book,C - Childrens book,CB - Comic Book,B - Book

enter image description here

答案 1 :(得分:2)

这很可能是因为在getPurchasePriceAdultBook中都实现了ChildrenBook,而在ComicBook中没有实现,getPurchasePrice继承了{{1}}的两个不同实现虚函数。

你也必须为ComicBook覆盖{{1}},并最终通过调用两个碱基中的一个来实现。