Использование декларации (производный класс) - PullRequest
6 голосов
/ 23 августа 2010
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-

Для введенных неконверсионных функций с помощью объявления об использовании в производный класс, функция считается быть членом производного класса для цель определения типа неявный параметр объекта.

1 Ответ

9 голосов
/ 23 августа 2010

Стандарт 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) объясняет:

Поскольку using-декларация является декларацией, ограничения на декларации с тем же именем в том же декларативном регионе также применяются к using-декларациям.

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

struct S { int d; int d; };
...