C++ 通过“撤消名称隐藏”;使用;关键词。在孙子班不工作
例如,在下面的程序中,我通过“使用”关键字撤消名称隐藏。如果我有一个基类和一个派生类,“我得到了预期的不明确调用错误”。但若我有两个派生类(child和grandchild),现在child和grandchild在这里有相同的重载函数,那个么我也会通过“using”关键字撤消名称隐藏。但它正在被编译并得到输出。我的问题是为什么我没有得到错误作为“对重载函数的模糊调用”C++ 通过“撤消名称隐藏”;使用;关键词。在孙子班不工作,c++,name-hiding,C++,Name Hiding,例如,在下面的程序中,我通过“使用”关键字撤消名称隐藏。如果我有一个基类和一个派生类,“我得到了预期的不明确调用错误”。但若我有两个派生类(child和grandchild),现在child和grandchild在这里有相同的重载函数,那个么我也会通过“using”关键字撤消名称隐藏。但它正在被编译并得到输出。我的问题是为什么我没有得到错误作为“对重载函数的模糊调用” 类基名隐藏 { 受保护的: int name隐藏示例(int t) { 您可能遇到了使用声明的特殊规则。C++14[namesp
类基名隐藏
{
受保护的:
int name隐藏示例(int t)
{
您可能遇到了使用声明的特殊规则。C++14[namespace.udecl]/15:
当using声明将基类中的名称带入
中的派生类作用域、成员函数和成员函数模板
派生类重写和/或隐藏成员函数和成员
同名函数模板、参数类型列表、,
cv限定符和基类中的ref限定符(如果有)(而不是冲突)。[…]
[示例:
-[结束示例]
关键是nameHidingexample(0)
vsnameHidingexample(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)
}