C++ 通过“撤消名称隐藏”;使用;关键词。在孙子班不工作

C++ 通过“撤消名称隐藏”;使用;关键词。在孙子班不工作,c++,name-hiding,C++,Name Hiding,例如,在下面的程序中,我通过“使用”关键字撤消名称隐藏。如果我有一个基类和一个派生类,“我得到了预期的不明确调用错误”。但若我有两个派生类(child和grandchild),现在child和grandchild在这里有相同的重载函数,那个么我也会通过“using”关键字撤消名称隐藏。但它正在被编译并得到输出。我的问题是为什么我没有得到错误作为“对重载函数的模糊调用” 类基名隐藏 { 受保护的: int name隐藏示例(int t) { 您可能遇到了使用声明的特殊规则。C++14[namesp

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

类基名隐藏
{
受保护的:
int name隐藏示例(int t)
{

您可能遇到了使用声明的特殊规则。C++14[namespace.udecl]/15:

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

-[结束示例]


关键是
nameHidingexample(0)
vs
nameHidingexample(f)
:第一个
0
int
,而第二个是
float
。如果我将第一个
0
转换为
f
,我会得到一致的行为(输出:派生/大派生)我猜想推广是在一个不确定的时间应用的,但是我不是C++ C++依赖查找的专家来知道细节。(老实说,代码很难将规范中的一些角落的例子包含在一个混乱的/律师的ISH方式中)。<代码>;<代码>:注释OK:D::F(int)重写B::f(int);实际上是在C++ 14中。
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
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)
}