我正在学习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设置虚拟可以解决这种歧义吗?
答案 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
答案 1 :(得分:2)
这很可能是因为在getPurchasePrice
和AdultBook
中都实现了ChildrenBook
,而在ComicBook
中没有实现,getPurchasePrice
继承了{{1}}的两个不同实现虚函数。
你也必须为ComicBook覆盖{{1}},并最终通过调用两个碱基中的一个来实现。