#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. Думаю, разработчики компилятора рассуждали, что раз виртуальные функции статическими быть не могут, то скорее всего программист не планировал ничего переопределять. Соответственно и ошибки, скорее всего, нет.
Комментариев нет:
Отправить комментарий