覆盖方法阴影重载的最终版本

Zhi*_*gor 11 c++ inheritance abstract-class overriding overloading

我有以下代码:

struct Abs {
    virtual void f(int x) = 0;
    virtual void f(double x) final { std::cout << 2; }
};

struct Sub: public Abs {
    void f(int x) final { std::cout << 1; }
};

Run Code Online (Sandbox Code Playgroud)

Abs是一个抽象类,由纯成员函数void f(int)及其重载版本组成void f(double x),该版本不再是纯成员函数final。如果我尝试void f(int)在派生结构中重写Sub,它会隐藏并打印void f(double)以下函数,转换为:main11.01int

int main() {
    Sub x = {};
    x.f(1.01);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我该如何克服这个问题?另外,为什么会这样呢?

son*_*yao 10

给定,在 class 的范围内找到x.f(1.01);名称,然后名称查找停止;的范围不会被审查。仅放入重载集中,然后执行重载决策。fSubAbsSub::f

...名称查找按如下所述检查范围,直到找到至少一个任何类型的声明,此时查找停止并且不再检查进一步的范围。

您可以使用引入intousing的名称,然后也可以找到并参与重载解析。AbsSubAbs::f

struct Sub: public Abs {
    using Abs::f;
    void f(int x) final { std::cout << 1; }
};
Run Code Online (Sandbox Code Playgroud)