3

次のコードを検討してください。

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

struct B
{
  void f();
};

struct C : public A, public B
{};

int main()
{
  A* a = new C();
  B* b = new C();
  C* c = new C();

  // All these calls should result in B::f
  a->f();
  b->f();
  c->f();
}

コンパイラはそれCが抽象的であると述べています。この状況をどのように解決できますか?この問題はダイヤモンドの継承に似ているように見えますが、解決策がわかりません。

編集:ありがとう、これは実際の例です:

#include "stdio.h"

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

struct B
{
  void f()
  {
      printf("B::f\n");
  }
};

struct C : public A, public B
{
  void f()
  {
      printf("C::f\n");
      B::f();
  }
};

int main()
{
  A* a = new C();
  B* b = new C();
  C* c = new C();

  printf("Calling from A\n");
  a->f();
  printf("Calling from B\n");
  b->f();
  printf("Calling from C\n");
  c->f();
}

出力:

Calling from A
C::f
B::f
Calling from B
B::f
Calling from C
C::f
B::f
4

2 に答える 2

4

問題は、2つのf()関数が同じ名前であっても、完全に無関係であるということです。

Cvirtual f()呼び出しが目的の動作である場合は、B::f()明示的に行う必要があります。

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

void C::f() {
  B::f();
}
于 2013-01-05T22:10:22.367 に答える
1

の基本クラスから仮想関数をオーバーライドする必要がありますC。呼び出したい場合は、次B::fのように言います。

struct C : A, B
{
    void f() { B::f(); }
};
于 2013-01-05T22:11:57.277 に答える