1

C++ でのダイヤモンドの問題 (多重継承) の解決策を理解しようとしています。

ソリューションをよりよく理解するためにこのコードを作成しましたが、期待どおりに動作しません。

#include <stdio.h>

class A
{
public:
    void Print()
    {
        printf("A\n");
    }
};

class B : virtual public A
{
public:
    void Print()
    {
        printf("B\n");
    }
};

class C : virtual public A
{
public:
    void Print()
    {
        printf("C\n");
    }
};

class D : public B, public C
{
};

int main()
{
    D d;
    d.Print();
}

Visual Studio 2008 Express Edition が叫​​ぶ: エラー C2385: 'Print' 1> のあいまいなアクセスは、ベース 'B' の 'Print' 1> またはベース 'C' の 'Print' である可能性があります エラー C3861: 'Print' : 識別子が見つかりません

ここで何が欠けているのか教えてください。

4

1 に答える 1

1

のどのバージョンを呼び出すPrint()必要がありますか? d.Print()2 つの選択肢があります。ただし、選択できます。

d.A::Print(); // this one isn't part of the overload set search without qualification
d.B::Print();
d.C::Print();

一意の最終オーバーライド関数がないためA::Print()、関数を作成しても役に立たないことに注意してください。で明示的にオーバーライドするvirtual必要があります。Print()D

于 2013-09-25T19:49:32.577 に答える