使用声明(派生类)

时间:2010-08-23 04:48:18

标签: c++ derived-class using-declaration

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 -

     

介绍非转换函数   通过使用声明到派生的   类,功能被认为是   是派生类的成员   定义类型的目的   隐式对象参数。

1 个答案:

答案 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; };