2017-01-25 8 views
1

Ключевое слово override позволяет убедиться в том, что функция будет переопределена. Я ищу обратную функциональность. Поэтому, когда я пишу новую функцию, я хочу отметить ее чем-то, чтобы убедиться, что она не будет случайно перезаписана.Есть ли обратная сторона 'переопределить' спецификатор в C++?

(Кроме того, я не хочу, чтобы сделать его static, поскольку он выглядит как принадлежать к объекту, а не класс)

+1

Что, например [спецификатор 'final'] (http://en.cppreference.com/w/cpp/language/final)? –

+0

Вы хотите «финал»? – Danh

+2

afaik 'override' гарантирует, что функция переопределяет одно в базовом классе, а не наоборот ... исправьте меня, если я ошибаюсь ... – user463035818

ответ

7

Я хочу, чтобы пометить его с чем-то, чтобы убедиться, что он не будет случайно перезаписаны.

Вы можете использовать final specifier. Пример из cppreference:

struct Base 
{ 
    virtual void foo(); 
}; 

struct A : Base 
{ 
    void foo() final; // A::foo is overridden and it is the final override 
    void bar() final; // Error: non-virtual function cannot be overridden or be final 
}; 
+0

Я хочу удостовериться, что я не переопределяю ничего из родительских классов. –

+0

final помогает только для классов, которые будут получены от меня. –

+0

@DraifKroneg: вы можете пометить методы родительского класса как «final». Если у вас нет доступа к определению родительского класса, нет способа предотвратить переопределение. –

5

Если вы не хотите, виртуальная функция быть переопределен в производном классе, вы можете использовать final:

Указывает, что виртуальная функция не может быть переопределен в производном классе или что класс не может быть унаследован от.

например.

struct Base 
{ 
    virtual void foo() final; // foo cannot be overridden in the derived class 
}; 
struct Derived : Base 
{ 
    void foo();    // Error: foo cannot be overridden as it's final in Base 
}; 
+0

Что делать, если у меня есть сотни родительских классов в дереве наследования? Я просто хочу удостовериться, что я случайно не отменяю ничего оттуда. Я не могу пройти через все из них и отметить каждую из них финальной. Я просто хочу добавить небольшую функцию и получить быструю ошибку компиляции, если она что-то переопределит. –

+0

Подводя итог: ключевое слово 'overrides' является локальным для моей текущей функции, а 'final' требует внесения изменений, сделанных потенциально во многих сотен классах. Это не одно и то же: это то, что я прошу. –

0

final это ключевое слово вы ищете.

Примечание: Помните, что override не «убеждается, что функция будет перегружена», как вы выразились. override в вашем классе действительно делает переопределение метода базового класса, а не просто вводит новый метод, аналогичный виртуальному методу базового класса.

Чтобы убедиться, что метод переопределен, он должен быть чистым виртуальным в вашем базовом классе.

Также, static работает точно так же: статические методы относятся к классу, нестатические методы требуют вызова объекта.