2

这是怎么回事——为什么不能编译?

#include <iostream>
class Base {
    void print(double d) {
        std::cout << "Base: " << d << std::endl;
    }
};

class Derived : public Base {
void print(std::string const & str) {
        std::cout << "Derived: " << str << std::endl;
    }
};

int main(int argc, char* argv[]) {
    Derived d;
    d.print(2.);
    d.print("junk");
}

(MinGW 和 VC11 中的错误与No conversion from double to std::string.)

如果我在 中更改打印函数的名称Derived,它会成功编译,所以很明显Derived::print(string const &)是以某种方式屏蔽Base::print(double)。但我的印象是函数签名包括参数类型,所以这个掩码应该发生在这里。在基类方法的情况下这不正确吗?

4

1 回答 1

3

print不,这是不正确的:当在同一范围内声明具有相同名称的函数时会发生名称隐藏:这里Derived 隐藏printof Base

在函数查找的这个(第一步)步骤中忽略参数名称/类型。

您可以将 Base 函数的声明带入 Derived 的using声明中:

using Base::print

如果您这样做,将进行常规的重载解决方案。

有关为什么在这种 Derived/Base 情况下会发生隐藏的详细信息,我建议这篇其他 SO 帖子完美地回答了它。

至于标准,此特定规则在第 3.3.1 节中定义:

名称隐藏[basic.scope.hiding]

可以通过在嵌套声明区域或派生类 (10.2) 中显式声明相同名称来隐藏名称。

于 2014-06-09T21:45:17.660 回答