2014-01-11 3 views
1

Мне очень нравится новое ключевое слово переопределения C++ 11, и я пытаюсь добавить его ко всему коду. Было бы неплохо, если бы компилятор помог мне определить все эти случаи.Использовать ключевое слово переопределения C++ обязательно?

Есть ли способ заставить компилятор вести себя так, как если бы ключевое слово переопределения было обязательным? Я использую Visual Studio 2012

Например, я хочу, чтобы компилятор испускать об ошибке/предупреждение:

class Base{ 
public: 
    virtual void the_virtual(){} 
}; 
class derive:public Base{ 
public: 
    void the_virtual(){} //warning/error wanted here 
}; 
+0

Вы рассматривали предложения «похожих вопросов», прежде чем публиковать этот вопрос ?! Об этом неоднократно спрашивали. –

+0

Мне бы очень хотелось получить предупреждение (или, что еще хуже, ошибку) только потому, что я сделал то, что вы написали. –

+0

Добавьте некоторый момент во время процесса стандартизации C++ 0x, который вы могли бы использовать для записи 'class Dervied explicit: public Base' для достижения этого. – Simple

ответ

2

Я хотел бы начать с основ и дать класс а virtual деструктор: компиляторы, как правило, предупреждают о что.

В отношении фактического вопроса маловероятно, что использование override будет обязательным, так как существует слишком много кода, которое необходимо было бы заплатить. Общее мнение, принятое комитетом по стандартам по таким вопросам, заключается в том, что качество выполнения проблемы : компиляторы полностью свободны от , предупреждая о всех видах потенциально проблематичной декларации. То есть, вы должны лоббировать своего поставщика компилятора или поставщика статического анализатора, чтобы создать предупреждение для этой ситуации. ... и если вы не думаете, что можете заставить продавцов применить чек, создайте его сами! Проверка наличия ключевого слова override при переопределении функции virtual с использованием, например, clang довольно проста.

Кроме того, вот пример, когда обязательное использование override бы не работы:

struct Base1 { 
    virtual ~Base1() {} 
    virtual int f() { return 0; } 
}; 
struct Base2 { 
    int f() { return 1; } 
}; 

template <typename Base> 
struct Derived: Base { 
    int f() { return 2; } 
}; 

int main() 
{ 
    Derived<Base1> d1; 
    Derived<Base2> d2; 
} 

В шаблоне класса Derived функция f() может или не может быть переопределение. Вы не можете условно поставить override.

Смежные вопросы