-
30-09-2019 - |
题
struct B1{
int d;
void fb(){};
};
struct B2 : B1{
using B1::d;
using B1::fb;
int d; // why this gives error?
void fb(){} // and this does not?
};
int main(){}
是因为, B1::fb()
被视为 B1::fb(B1*)
and B2::fb()
像...一样对待 B2::fb(B2*)
?也就是说,隐式参数是否有助于区分这些?
$13.3.1/4-
对于由使用 - 元素引入的非转换函数,以定义隐式对象参数的类型,该函数被认为是派生类的成员。
解决方案
C ++标准(C ++03§7.3.3/12)说明:
当一个 使用解释 将基本类的名称从派生的类范围中带入派生类中的成员函数覆盖和/或隐藏成员函数,具有相同的名称和参数类型(而不是冲突)。
在您的示例中 B2::fb()
隐藏 B1::fb()
由使用声明引入。
至于为什么它两者都不符合 using B1::d;
和 int d;
在定义中 B2
, ,C ++标准(C ++03§7.3.3/10)说明:
自从 使用解释 是声明,同一声明区域中对同名声明的限制也适用于 使用解释。
因此,它的形式不正确,其原因是以下不明显:它在一个声明区域中产生两个具有相同名称的对象:
struct S { int d; int d; };
不隶属于 StackOverflow