2016-02-19 6 views
26

Пусть у меня есть класс A с виртуальной функции F():Разница между переосмысление и переопределение функции

class A 
{ 
    virtual void F() 
    { 
     // Do something 
    }; 
}; 

И у меня есть еще один класс B который наследует A и переопределяетF():

class B : A 
{ 
    void F() 
    { 
     // Do something 
    }; 
}; 

И другой класс C, который также наследует A, но переопределяетF():

class C : A 
{ 
    void F() override 
    { 
     // Do something 
    }; 
}; 

В чем разница между F() в классах B и C?

ответ

24

Оба B::f() и C::f() являются переопределениями, и они точно то же самое.

override по существу время компиляции консультативный термин, который вызовет ошибку компиляции если функция делает не переопределение один в базовом классе.

Это может помочь обеспечить стабильность программы: если имя и типы параметров до A::f() изменены, тогда возникает ошибка компиляции.

29

Оба являются переопределениями.

Когда вы используете ключевое слово override, вы обеспечиваете сбой компиляции, если это должно произойти с , а не - переопределить.

И это хорошая практика.

+3

Не говоря уже о коэффициенте читаемости при просмотре репозиториев, таких как git – Tgsmith61591

+0

@ Tgsmith61591: Да. Я также задался вопросом, следует ли включать пример перегрузки (по существу, «переопределить») без переопределения. Но я решил быть кратким. :) –