#cpp #clang #сокрытие_функций
Имеем код:
struct B
{
virtual void f() {}
};
struct D : B
{
void f(int) { }
};
int main() { }
clang выдаёт для него предупреждение:
'D::f' hides overloaded virtual function [-Woverloaded-virtual]
Теперь делаем f(int) статической в классе D:
struct B
{
virtual void f() {}
};
struct D : B
{
static void f(int) { }
};
int main() { }
Код компилируется без предупреждений. Однако попытка использовать f() на объекте
класса D:
int main()
{
D d;
d.f();
}
приводит к ошибке:
too few arguments to function call, expected 1, have 0
Т.е. static f(int) по-прежнему скрывает функцию из B. Проблема решается добавлением
using B::f; в класс D и код компилируется успешно. Но возникает вопрос:
Есть ли какие-то объективные причины не выдавать предупреждение при сокрытии функции
B::f() статической D::f(int)?
Ответы
Ответ 1
Насколько я понимаю, это предупреждение нужно для того, чтобы предотвратить ошибки, связанные с сокрытием виртуальной функции, когда требовалось ее переопределение. Например при опечатке: struct chart; struct Base{ virtual void* get(char* e); }; struct Derived: public Base{ void* get(chart* e); //Ой }; Ключевое слово override могло бы решить эту проблему, но до тех пор пока оно необязательное, эта диагностика будет жить и периодически срабатывать. Что касается static. Думаю, разработчики компилятора рассуждали, что раз виртуальные функции статическими быть не могут, то скорее всего программист не планировал ничего переопределять. Соответственно и ошибки, скорее всего, нет.
Комментариев нет:
Отправить комментарий