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