Я изучаю 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 {} ;
(Я убрал все методы и конструкторы для упрощения)
Теперь, если я хочу создать ComicBook и узнать его цену покупки, как я могу это сделать?
Если я выполняю getPurchasePrice () на ComicBook, я получаю следующую ошибку:
error: request for member 'getPurchasePrice' is ambiguous
Я думал, что установка виртуального для ChildrenBook и AdultBook решит эту двусмысленность?
Вы используете либо
obj->AdultBook::getPurchasePrice();
или же
obj->ChildrenBook::getPurchasePrice();
или же
obj->Book::getPurchasePrice();
За obj
типа ComicBook
РЕДАКТИРОВАТЬ ДЛЯ Эмилио Гаравалья
Предположим, что вы не переопределены getPurchasePrice
для книги для взрослых и детей, вы могли бы иметь это
Ключ A — книга для взрослых, C — детская книга, CB — книга комиксов, B — книга
Скорее всего это связано с тем, что getPurchasePrice
реализован в обоих AdultBook
а также ChildrenBook
, но не в ComicBook
, который наследует две разные реализации для одной и той же виртуальной функции.
Вы должны переопределить getPurchasePrice
для ComicBook, и, в конечном итоге, реализовать с вызовом к одной из двух баз.