C ++多重和虚拟继承

时间:2014-01-17 09:19:37

标签: c++ inheritance virtual

我正在尝试实现以下类:

class  a {
public :
  //...
  f();
  //...
};

class  b : virtual public a {
 public :
   //...
   f();
   //...
}

class  c : virtual public a {
 public :
   //...
   f();
   //...
}

class  d : virtual public c {
 public :
   //...
   f();
   //...
}

class  e : public b, public d {
 public :
   //...
}

但是编译器告诉我成员函数f()的请求是不明确的。 我希望'e'继承自'd'的f()版本(所以'c'一个),但只有当我在'e'中重新声明f()时,代码才会编译。因此,我只能编译'e'构造函数,如下所示:

e::e(...) : a(...), c(...), b(...), d(...)
{
}

这对我来说似乎是不合逻辑的,因为'd'从'c'和'b'开始加热将首先构建。

2 个答案:

答案 0 :(得分:2)

与施工或声明的顺序无关。如果有两个具有相同方法名称的基类,则编译器无法分辨您要调用哪一个。在您的情况下,您在类b和类d中都有一个重写的f()版本。

因此请明确调用此调用。 b :: f()或d :: f()。

答案 1 :(得分:1)

e继承自b& d,所以有f版本的f()和d版本的f()。

存在歧义是非常符合逻辑的。

如果你想让e级使用d版本的f(),有两种方法,

  1. 直接在调用中调用d :: f()

    instance_e.d::f(); //will call d::f().

  2. 在e

    中重新声明d :: f()

    class e : public b, public d { public : using d::f; }

  3. 我不明白为什么你在这里提到构造函数,构造的顺序对函数f()没有影响。