派生类通过基类定义函数

时间:2013-01-05 22:08:16

标签: c++ inheritance polymorphism

请考虑以下代码:

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

2 个答案:

答案 0 :(得分:3)

问题在于两个f()函数完全不相关,即使它们碰巧具有相同的名称。

如果所需行为适用于C virtual f()来呼叫B::f(),则必须明确地执行此操作:

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

void C::f() {
  B::f();
}

答案 1 :(得分:1)

您需要在C中覆盖基类中的虚函数。如果您想要拨打B::f,请这样说:

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