2010-08-23 4 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) объясняет:

При использовании декларация приносит имена из базового класса в производном классе сферы, функции-члены в переопределении производного класса и/или скрыть функции-члены с тем же именем и типами параметров в базовом классе (а не в конфликте).

В вашем примере B2::fb() скрывает B1::fb(), указанный в объявлении.

А почему он плохо сформирован, чтобы иметь как using B1::d; и int d; в определении B2, стандартный С ++ (C++ 03 §7.3.3/10) объясняет:

Поскольку using-declaration - это объявление, ограничения на объявления с тем же именем в том же декларативном регионе также применимы к объявлениям .

Таким образом, он плохо сформирован по той же причине, что следующее плохо формируется: это приводит к двум объектам с тем же именем в одной декларативной области:

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

и INT г конфликтует с предыдущим объявлением его от использования ... – diverscuba23

+0

Какова реальная зависимость от $ 13.3.1/4 в этом случае? – Chubsdad

+1

@chubsdad: Поскольку 'B2 :: fb()' hides 'B1 :: fb() ',' B1 :: fb() 'не рассматривается как функция-кандидат во время разрешения перегрузки, поэтому §13.3.1/4 делает не применять. –

Смежные вопросы