Использование декларации (производный класс)

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; };
Другие вопросы по тегам