Беда с множественным наследованием. Как вызвать базовую функцию?

Я изучаю 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 решит эту двусмысленность?

0

Решение

Вы используете либо

obj->AdultBook::getPurchasePrice();

или же

obj->ChildrenBook::getPurchasePrice();

или же

obj->Book::getPurchasePrice();

За obj типа ComicBook

РЕДАКТИРОВАТЬ ДЛЯ Эмилио Гаравалья

Предположим, что вы не переопределены getPurchasePrice для книги для взрослых и детей, вы могли бы иметь это

Ключ A — книга для взрослых, C — детская книга, CB — книга комиксов, B — книга

введите описание изображения здесь

2

Другие решения

Скорее всего это связано с тем, что getPurchasePrice реализован в обоих AdultBook а также ChildrenBook, но не в ComicBook, который наследует две разные реализации для одной и той же виртуальной функции.

Вы должны переопределить getPurchasePrice для ComicBook, и, в конечном итоге, реализовать с вызовом к одной из двух баз.

2

По вопросам рекламы [email protected]