如果存在具有不同参数的继承成员,为什么对C++结构函数的调用不明确?

Rep*_*kas 20 c++ polymorphism virtual inheritance class

代码如下.我的D类中有一个单独的函数f()和一个函数f(int),那么如果两个函数都有不同的参数,为什么该调用不明确?

struct A {
    void f() {}
};

struct B: virtual A {
    void f(int i) {}
};

struct C: virtual A {
    void f() {}
};

struct D: B, C {

};

int main()
{
    D d;
    d.f(5); //ambiguous
}
Run Code Online (Sandbox Code Playgroud)

asc*_*ler 28

这里的问题是成员名称查找,它在评估哪些函数可行并应用重载解析之前发生.当名称查找从两个或多个不相关的基类中查找名称时,这被认为是不明确的查找,它立即无效.

有关更多详细信息,请阅读类成员定义中的非限定名称查找.(这实际上不是您在此处的上下文,但相同的规则适用于成员访问表达式.)

您可以通过使用qualified-id指定要在其中开始查找的基类来解决此问题:

d.B::f(5);
Run Code Online (Sandbox Code Playgroud)

或者,您可以直接在D以下位置明确显示这两个函数:

struct D: B, C {
    using B::f;
    using C::f;
};
Run Code Online (Sandbox Code Playgroud)

  • 哇,今天我了解到`var.Class :: method()`是合法的语法. (10认同)