我正在尝试实现以下类:
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'开始加热将首先构建。
答案 0 :(得分:2)
与施工或声明的顺序无关。如果有两个具有相同方法名称的基类,则编译器无法分辨您要调用哪一个。在您的情况下,您在类b和类d中都有一个重写的f()版本。
因此请明确调用此调用。 b :: f()或d :: f()。
答案 1 :(得分:1)
e继承自b& d,所以有f版本的f()和d版本的f()。
存在歧义是非常符合逻辑的。
如果你想让e级使用d版本的f(),有两种方法,
直接在调用中调用d :: f()
instance_e.d::f(); //will call d::f().
在e
中重新声明d :: f() class e : public b, public d {
public :
using d::f;
}
我不明白为什么你在这里提到构造函数,构造的顺序对函数f()没有影响。