【问题标题】:Using declaration (Derived class)使用声明(派生类)
【发布时间】:2011-04-02 11:16:50
【问题描述】:
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++ derived-class using-declaration


    【解决方案1】:

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

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

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

    至于为什么在B2 的定义中同时包含using B1::d;int d; 是错误的,C++ 标准(C++03 §7.3.3/10)解释道:

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

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

    struct S { int d; int d; };
    

    【讨论】:

    • 在这种情况下,13.3.1/4 美元的真正含义是什么?
    • @chubsdad:由于B2::fb() 隐藏了B1::fb()B1::fb() 在重载决议期间不被视为候选函数,因此 §13.3.1/4 不适用。
    猜你喜欢
    • 2010-12-06
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多