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