继承时的范围规则 - C++

Nav*_*K N 7 c++ scope

我正在阅读Stroustrup的C++ 0x FAQ,并坚持使用这段代码.请考虑以下代码

struct A
{
    void f(double)
    {
        std::cout << "in double" << std::endl;
    }
};

struct B : A
{
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};


int main()
{
    A a; a.f(10.10);  // as expected, A.f will get called
    B b; b.f(10.10);  // This calls b.f and we lose the .10 here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,当一个类型被继承时,所有受保护的和公共成员都可以从派生类访问.但根据这个例子,看起来我错了.我期待bf会调用基类f.我通过改变派生类得到了预期的结果

struct B : A
{
    using A::f;
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么它不能在第一个代码中工作?
  2. C++标准中的哪个部分描述了所有这些范围规则?

aJ.*_*aJ. 5

因为A :: f是"隐藏"而不是"重载"或"被覆盖".参考:

http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9


mor*_*lli 4

第一个代码的工作方式与 C++ 的设计工作方式相同。

重载解析遵循一组非常复杂的规则。来自 Stroustrup 的 c++ 圣经 15.2.2 “不同基类的函数之间的歧义不能根据参数类型来解决。”

他接着解释了您所描述的“使用”的用法。

这是该语言的设计决策。

我倾向于遵循 Stroustrup 的书而不是标准,但我确信它就在那里。

[编辑]

这是(来自标准):

第13章

当在同一范围内为单个名称指定两个或多个不同的声明时,该名称被称为重载。

进而:

13.2 声明匹配

1 如果两个同名函数声明位于同一作用域并且具有等效参数声明,则它们指的是同一个函数 (13.1)。派生类的函数成员与基类中的同名函数成员不在同一作用域中。