2012-05-21 4 views
6

Есть ли способ в C++ убедиться, что виртуальный метод в подклассе фактически переопределяет виртуальный метод суперкласса? Иногда, когда я рефакторинг, я забываю метод, а затем задаюсь вопросом, почему он не вызывается, но я забыл изменить подпись метода, чтобы он больше не переопределял ничего.@overrides для C++?

Благодаря

ответ

9

Это возможно в C++ 11, с override идентификатором:

struct Base {  
    virtual void foo() const { std::cout << "Base::foo!\n"; } 
}; 

struct Derived : virtual public Base { 
    virtual void foo() const override {std::cout << "Derived::foo!\n";} 
}; 

Это позволяет выяснить, во время компиляции ли вы неисправные переопределить метод. Здесь мы пренебрегаем, чтобы сделать метод const:

struct BadDerived : virtual public Base { 
    virtual void foo() override {std::cout << "BadDerived::foo!\n";} // FAIL! Compiler finds our mistake. 

}; 
1

Это является feature of C++11 используя override ключевое слово.

Если вы используете Visual C++ 2005 или новее, вы также можете использовать explicit override feature без поддержки C++ 11.

Что касается статуса реализации различных компиляторов, см. Apache stdcxx's site.

GCC 4.7.0 реализует эту функцию, MSVC реализует стандартизованную версию как Visual C++ 11.0 (будет поставляться с выпуском Visual Studio 2012).

+0

Эта функция «явного переопределения» - это C++/CLI, а не C++. –

+1

Незначительный nitpick, переопределение - это не ключевое слово, а идентификатор. Я думаю, что это не ключевое слово, чтобы не нарушать код C++ 03. – juanchopanza

+1

@CatPlusPlus - Кажется, я помню, что существует расширение от Microsoft для реализации функции переопределения в родном C++ вместо простого C++/CLI. Я могу ошибаться. http://msdn.microsoft.com/en-us/library/z8ew2153(v=vs.80).aspx – birryree

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