Стандарт 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; };