Сообщение об устаревании GCC при переопределении - PullRequest
0 голосов
/ 10 июня 2018

В GCC вы можете создать предупреждение об устаревании, когда кто-то вызывает устаревшую функцию с помощью

void __attribute__((deprecated)) foo() {}

Можно ли создать аналогичное предупреждение об устаревании, когда кто-то переопределяет виртуальный метод класса?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Использование [[deprecated]] и [[deprecated(message)]] стандартных атрибутов (доступно с C ++ 14) создает желаемый эффект в Visual Studio как для использования устаревшего метода, так и для попытки переопределениявыдав предупреждение C4996 (которое можно игнорировать).Я не могу говорить о других компиляторах, я ожидаю, так как это стандарт, они должны также соответствовать.

class Base
{
public:
    [[deprecated("dont use, deprecated")]] virtual void foo()
    {
    }
};

class Derived : public Base
{
public:
    void foo() override 
    {
    }
};


int main()
{
    Base b;
    b.foo();
}

Это выдаст 2 предупреждения, одно для переопределения и одно для попытки использования,

0 голосов
/ 10 июня 2018

Это приведет к ошибке, а не к предупреждению, но вы можете добавить спецификатор final к объявлению метода в вашем базовом классе.Тогда никто не сможет переопределить его.

Вы также можете сгенерировать сообщение об устаревании во время выполнения (а не во время компиляции), вызвав функцию и проверив, выполняет ли она реализацию базового класса или нет (установив флаг вреализация базового класса, затем проверка его после вызова).

...