Преднамеренно скрытая перегруженная функция предупреждения об избежании

Рассмотрим следующий пример C ++ main.cpp файл:

class FooIf
{
public:
virtual int handle(char *req, char *res) = 0;
};

class BarIf
{
public:

virtual void handle(char *msg) = 0;
};

class Bar : private BarIf
{
private:
void handle(char * msg){}
};

class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
int handle(char *req, char *res){ return (0); }
};

int main(){

Zoo zoo;
return (0);
}

Я получаю это предупреждение:

$ clang++ -ggdb -c main.cpp -Wall
main.cpp:23:6: warning: 'Zoo::handle' hides overloaded virtual function [-Woverloaded-virtual]
int handle(char *req, char *res){ return (0); }
^
main.cpp:17:7: note: hidden overloaded virtual function 'Bar::handle' declared here: different number of parameters (1 vs 2)
void handle(char * msg){}
^

Сейчас .. я действительно прячусь Bar::handle и я делаю это нарочно.

Есть ли способ избежать подавления предупреждения во время обдумывания этого?

Нет необходимости говорить, что g++ вообще не жалуется на это.

0

Решение

Вы должны рассмотреть другой дизайн. Это кажется проблемой с запахом кода / дизайном, если вам это действительно нужно.

Если (по какой-либо причине) вы действительно хотите это сделать, вы можете отключить предупреждение в определенном месте. Смотрите здесь для информации http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas

В вашем случае это будет выглядеть так

class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Woverloaded-virtual"int handle(char *req, char *res){ return (0); }
#pragma clang diagnostic pop
};
5

Другие решения

Предупреждения определяют возможные проблемы.

Возможно это ключевое слово здесь. Ваш код может работать совершенно нормально, если вы игнорируете предупреждения. Но по опыту миллионов разработчиков более триллионов строк кода заставили компилятор сказать «это плохая идея».

Исправление состоит в подавлении предупреждения или просто переименовании метода.

Это потенциальное предупреждение, потому что значение handle в этом классе меняется незначительно в зависимости от того, как именно вы вызываете его. Кроме того, люди иногда случайно потерпеть поражение перегружать функцию, дав ей немного другую подпись.

Между ними стоит пометить это как предупреждение.

Лучший способ исправить это будет зависеть от деталей, не указанных в вашем вопросе.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector