9
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-

对于通过 using 声明引入派生类的非转换函数,为了定义隐式对象参数的类型,该函数被认为是派生类的成员。

4

1 回答 1

12

C++ 标准 (C++03 §7.3.3/12) 解释:

using 声明将基类中的名称带入派生类范围时,派生类中的成员函数会覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。

在您的示例中,B2::fb()隐藏B1::fb()了 using 声明引入的内容。

至于为什么同时拥有using B1::d;int d;的定义是不正确的B2,C++ 标准(C++03 §7.3.3/10)解释说:

由于using-declaration是一个声明,因此在同一声明区域中对同名声明的限制也适用于using-declaration。

因此,它是非良构的,原因与以下是非良构的相同:它会在一个声明性区域中产生两个具有相同名称的对象:

struct S { int d; int d; };
于 2010-08-23T04:53:42.693 回答