В C ++ метод можно переопределить, если он был отмечен virtual
. Вы можете думать о virtual
как синониме «overridable».
Ключевое слово virtual
должно появиться в базовом классе. Он также может появиться необязательно в подклассах в точке переопределения, но это не обязательно.
Если вы используете компилятор, который поддерживает C ++ 11 (и вы должны, если вы изучаете C ++) , Я рекомендую вам всегда использовать новое ключевое слово override
, когда вы хотите переопределить:
class Base {
public:
virtual void speak() {
std::cout << "Base";
}
};
class Derived : public Base {
public:
void speak() override { // <---
std::cout << "Derived";
}
};
Если этот метод не является переопределением, компилятор скажет вам об этом, указав ошибку.
Не всегда очевидно, что первое чтение проверяется, является ли метод переопределением. Например, правильная ковариантность возвращаемого типа:
class A {};
class B : public A {};
class Base {
public:
virtual A* foo() {
return nullptr;
}
};
class Derived : public Base {
public:
B* foo() override {
return nullptr;
}
};
Это может быть не очень полезно очень часто, но override
дает понять, что кто-то должен ее прочитать.
Кроме того, если у вас есть хотя бы один виртуальный метод в вашем классе, также сделать его деструктор виртуальным. Это гарантирует, что все деструкторы будут работать при необходимости, и все будет очищено правильно:
class App {
public:
App() {}
virtual ~App() {} // <---
void run() {
this->speak();
}
virtual void speak() {
std::cout << "Base\n";
};
};