Использование декларации (производный класс)
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 в производный класс, эта функция считается членом производного класса с целью определения типа неявного параметра объекта.
1 ответ
Стандарт C++ (C++03 §7.3.3/12) объясняет:
Когда объявление using переносит имена из базового класса в область производного класса, функции-члены в производном классе переопределяют и / или скрывают функции-члены с одинаковыми именами и типами параметров в базовом классе (а не конфликтующие).
В вашем примере B2::fb()
прячет B1::fb()
введено объявлением об использовании.
Что касается того, почему плохо иметь using B1::d;
а также int d;
в определении B2
стандарт C++ (C++03 §7.3.3/10) объясняет:
Поскольку декларация использования является декларацией, ограничения на декларации с одинаковыми именами в одном и том же декларативном регионе также применяются к декларациям использования.
Таким образом, он плохо сформирован по той же причине, по которой неверно сформировано следующее: в результате получается два объекта с одинаковым именем в одной декларативной области:
struct S { int d; int d; };