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 -
介绍非转换函数 通过使用声明到派生的 类,功能被认为是 是派生类的成员 定义类型的目的 隐式对象参数。
答案 0 :(得分:9)
C ++标准(C ++03§7.3.3/ 12)解释:
当 using-declaration 将基类中的名称带入派生类范围时,派生类中的成员函数会覆盖和/或隐藏基础中具有相同名称和参数类型的成员函数阶级(而不是冲突)。
在您的示例中,B2::fb()
隐藏了使用声明引入的B1::fb()
。
至于为什么在using B1::d;
的定义中同时具有int d;
和B2
的格式不正确,C ++标准(C ++03§7.3.3/ 10)说明:
由于 using-declaration 是一个声明,因此对同一声明区域中同名声明的限制也适用于 using-declarations。
因此,由于以下形式不正确的原因,它的结构不正确:它会在一个声明区域中产生两个具有相同名称的对象:
struct S { int d; int d; };