#новичкам
Для начала. Что будет если не пометить переопределенный в дочернем классе метод как override?
Обычно говорят, что override генерирует проверку компилятора, что данный метод действительно переопределяет метод базового класса. И соотвественно ошибку в случае, если это не так.
Проверки - это дело важное и нужное, их нужно использовать. Но в том-то и дело, что override - это лишь проверка. Она никак не влияет на то, реально ли переопределяется метод или нет.
Взглядните на этот код:
struct Base {
virtual void foo(int i) const {
std::cout << "Base" << std::endl;
}
virtual ~Base() = default;
};
struct Derived : Base {
void foo(int) const {
std::cout << "Derived" << std::endl;
}
};
int main() {
std::unique_ptr<Base> p = std::make_unique<Derived>();
p->foo(42);
}Является ли метод foo в Derived переопределением метода из Base?
Казалось бы, нет пометок ни virtual, ни override.
Но это и не важно. Главное, чтобы сигнатура метода из дочернего класса была ровно такой же, какой была сигнатура виртуального метода в базовом классе. Здесь с этим все в порядке, поэтому метод действительно переопределяется..
То есть метод не переопределяется только в случае отличной сигнатуры. Поставьте в этом случае override и тогда будет ошибка компиляции. Поставьте в наследнике virtual и сделаете новый метод виртуальный метод в наследнике. Ничего не делаете и получите просто новый невиртуальный метод в наследнике.
Что же влияет на сигнатуру?
1️⃣ Имя функции и набор параметров. Это банально и все знают.
2️⃣ CV-квалификация метода. Грубо говоря, константный метод или нет.
3️⃣ Ref-квалификация метода. Говорили о них тут.
Если что-то из этого не соответствует виртуальному методу в родительском классе, то дочерний метод не будет переопределять родителя.
Use checks. Stay cool.
#cppcore