0

私は 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() を実行すると、次のエラーが発生します。

error: request for member 'getPurchasePrice' is ambiguous

ChildrenBook と AdultBook に virtual を配置すると、あいまいさが解決されると思いましたか?

4

2 に答える 2

2

どちらかを使用します

obj->AdultBook::getPurchasePrice();

また

obj->ChildrenBook::getPurchasePrice();

また

obj->Book::getPurchasePrice();

objタイプの場合ComicBook

エミリオ・ガラヴァリアの編集

getPurchasePrice大人向けと子供向けの本を再定義していないと仮定しましょう。

キー A - 大人の本、C - 子供の本、CB - コミック本、B - 本

ここに画像の説明を入力

于 2012-11-05T12:54:24.530 に答える
2

これは、 がとgetPurchasePriceの両方で実装されているが、 が同じ仮想関数に対して 2 つの異なる実装を継承していることが原因である可能性が最も高いです。AdultBookChildrenBookComicBook

ComicBook もオーバーライドする必要がgetPurchasePriceあり、最終的には 2 つのベースのいずれかを呼び出して実装します。

于 2012-11-05T12:54:27.260 に答える