4

以下のコードでは、次の警告とエラーが表示されます。

test.cpp:15: warning: direct base 'B' inaccessible in 'D' due to ambiguity
test.cpp:15: error: no unique final overrider for 'virtual void A::f()' in 'D'

しかし、A から B の仮想継承を削除すると (つまりstruct B : public A)、警告のみが表示され、エラーは発生しません。

struct A
{
  virtual void f() = 0;
};

struct B : public virtual A
{
  void f() {}
};

class C : public B
{};

struct D : public C, virtual B
{};

int main()
{
  return 0;
}

なんで?これは恐ろしいダイヤモンドですか?

4

3 に答える 3

2

から「最終オーバーライド」の定義を見てみましょう10.3[class.virtual]/2

C::vfクラス オブジェクトの仮想メンバー関数は、基底クラス サブオブジェクト (存在する場合)Sである最も派生したクラスが、Sオーバーライドする別のメンバー関数を宣言または継承しない限り、最終オーバーライドvfです。

派生クラスでは、基本クラスのサブオブジェクトの仮想メンバー関数に複数の最終オーバーライドがある場合、プログラムの形式が正しくありません。

A からの仮想継承では、型 A の基底クラス サブオブジェクトは 1 つだけであり、その仮想メンバー関数 f() には複数の最終オーバーライド (型 B の各サブオブジェクトに 1 つ) があります。

A からの仮想継承がない場合、タイプ A の 2 つの異なる基本クラス サブオブジェクトがあり、それらの仮想メンバー関数 f() にはそれぞれ独自の最終オーバーライド機能 (各 B サブオブジェクトに 1 つ) があります。

于 2013-10-31T17:45:43.377 に答える