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

问题是这两个f()函数完全不相关,即使它们碰巧同名。

如果所需的行为是让C'svirtual 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 回答