Страницы

Поиск по вопросам

понедельник, 15 октября 2018 г.

Сокрытие виртуальной функции базового класса статической функцией в производном классе

Имеем код:
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)?


Ответ

Насколько я понимаю, это предупреждение нужно для того, чтобы предотвратить ошибки, связанные с сокрытием виртуальной функции, когда требовалось ее переопределение. Например при опечатке:
struct chart; struct Base{ virtual void* get(char* e); };
struct Derived: public Base{ void* get(chart* e); //Ой };
Ключевое слово override могло бы решить эту проблему, но до тех пор пока оно необязательное, эта диагностика будет жить и периодически срабатывать.
Что касается static. Думаю, разработчики компилятора рассуждали, что раз виртуальные функции статическими быть не могут, то скорее всего программист не планировал ничего переопределять. Соответственно и ошибки, скорее всего, нет.

Комментариев нет:

Отправить комментарий