2010-08-23 75 views
6
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-

对于由使用-声明引入 成一个派生类 ,该函数被认为是 是派生类的一个成员为 的目的nonconversion功能定义隐式对象参数的类型 。

回答

9

C++标准(C++ 03§7.3.3/ 12)说明:

using声明带来从基类名转换成一个派生类范围,成员函数在派生类中覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。

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

至于为什么它是形成不良的同时具有using B1::d;int d;B2定义中,C++标准(C++ 03§7.3.3/ 10)说明:

由于使用声明是声明,对同一声明区域中同一声明的声明限制也适用于使用声明。

所以,它是形成不良出于同样的原因,以下是非法的构造:它会导致相同名称的两个对象在一个声明区:

struct S { int d; int d; }; 
+0

和INT d与之前使用的声明冲突... – diverscuba23 2010-08-23 04:56:26

+0

在这种情况下,$ 13.3.1/4的真实含义是什么? – Chubsdad 2010-08-23 05:08:05

+1

@chubsdad:由于'B2 :: fb()'隐藏了B1 :: fb()',因此在重载过程中'B1 :: fb()'不被视为候选函数,所以§13.3.1/ 4会不适用。 – 2010-08-23 05:10:02