Я случайно удалил квалификатор const
из реализации производного класса виртуального метода.Я обычно использую Clang, который выдает предупреждение об этом.Когда я переключился на gcc с Wall
, это осталось совершенно незамеченным.Почему это?Вот мой файл:
$ cat main.cpp
#include <iostream>
class Father {
public:
virtual int get() const { return 8; }
};
class Son : public Father {
public:
virtual int get() /* const */ { return 6; }
};
int main(int argc, char **argv)
{
Father *f = new Son;
std::cout << f->get() << "\n";
return 0;
}
А вот выходы компиляции для gcc и clang:
$ clang++ -Wall main.cpp -o main
main.cpp:10:14: warning: 'Son::get' hides overloaded virtual function
[-Woverloaded-virtual]
virtual int get() /* const */ { return 6; }
^
main.cpp:5:14: note: hidden overloaded virtual function 'Father::get' declared
here: different qualifiers ('const' vs unqualified)
virtual int get() const { return 8; }
^
1 warning generated.
И
$ g++ -Wall main.cpp -o main
$ ./main
8