Недавно у меня была неприятная проблема, которая сводилась к очень простой ошибке кодирования. Рассмотрим следующий код:
#include <iostream>
class Base
{
public:
void func() { std::cout << "BASE" << std::endl; }
};
class Derived : public Base
{
public:
virtual void func() { std::cout << "DERIVED" << std::endl; }
};
int main(int argc, char* argv[])
{
Base* obj = new Derived;
obj->func();
delete obj;
return 0;
}
Выход
БАЗА
Очевидно (для этого случая) я намеревался поместить виртуальное ключевое слово в Base :: func, чтобы Derived :: func вызывался в main. Я понимаю, что это (вероятно) разрешено стандартом c ++, и, возможно, по уважительной причине, но мне кажется, что в 99% случаев это будет ошибкой кодирования. Однако когда я скомпилировал с использованием g ++ и всех опций -Wblah, о которых я мог подумать, предупреждений не было.
Есть ли способ генерировать предупреждение, когда и базовый, и производный класс имеют функции-члены с одинаковыми именами, где функция производного класса является виртуальной, а функция базового класса - нет?