撤消按关键字隐藏的名称"using"。在孙子班不工作

Undo name hiding by "using" keyword. Does not work in grandchild class

本文关键字:工作 using 隐藏 关键字 撤消      更新时间:2023-10-16

例如,在下面的程序中,我通过"using"关键字撤消名称隐藏。如果我有一个基类和一个派生类"我得到了预期的模糊调用错误"。但若我有两个派生类(child和grand-child),现在child和sund-child在这里有相同的重载函数,我也会通过"using"关键字撤消名称隐藏。但它正在被编译并得到输出。我的问题是,为什么我没有得到错误,因为"对重载函数的模糊调用"。

class baseNameHiding
{
protected:
int nameHidingexample(int t)
{
    cout<<"im baseeeeeeeeeeee"<<endl;
    return 0;
}
};
class derivedNameHiding:public baseNameHiding
{   
public:
    float nameHidingexample(float s)
    {
        cout<<"im derived"<<endl;
        return 0;
    }
    using baseNameHiding::nameHidingexample;
};
class grandDerivedNameHiding:public derivedNameHiding
{
public:
    float nameHidingexample(float f)
    {
        cout<<"im grand derived"<<endl;
        return 0;
    }
    using baseNameHiding::nameHidingexample;
    using derivedNameHiding::nameHidingexample;
};
int main()
{
    char a;float f = 0.0;
    derivedNameHiding derived;
    derived.nameHidingexample(0);
    grandDerivedNameHiding grandchild;
    grandchild.nameHidingexample(f);
    cin>>a;
} 

//output
im baseeeeeeeeeeee
im grand derived

您遇到了使用声明的的特殊规则。C++14[命名空间.udcl]/15:

using声明将基类中的名称带入中的派生类作用域、成员函数和成员函数模板派生类重写和/或隐藏成员函数和成员具有相同名称的函数模板,参数类型列表cv限定符和基类中的ref限定符(如果有的话)(而不是冲突的)。[…]示例:

struct B {
    virtual void f(int);
    virtual void f(char);
    void g(int);
    void h(int);
};
struct D : B {
    using B::f;
    void f(int);    // OK: D::f(int) overrides B::f(int);
    using B::g;
    void g(char);   // OK
    using B::h;
    void h(int);    // OK: D::h(int) hides B::h(int)
};
void k(D* p)
{
    p->f(1);        // calls D::f(int)
    p->f(’a’);      // calls B::f(char)
    p->g(1);        // calls B::g(int)
    p->g(’a’);      // calls D::g(char)
}

--结束示例]