Страницы

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

вторник, 10 декабря 2019 г.

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

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

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

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