Ключевое
Перекрытие (сокрытие) функций-членов означает, что метод производного класса скрывает метод базового класса с таким же именем. Переопределение функций-членов означает, что производный класс предоставляет свою реализацию виртуального метода базового класса.
Перекрытие (сокрытие)
- Определение: Когда метод базового класса скрывается (перекрывается) методом производного класса с таким же именем и сигнатурой, но без ключевого слова
virtual
. - Особенности: При сокрытии метод базового класса становится недоступным через объект производного класса.
- Пример:
#include <iostream>
class Base {
public:
void show() {
std::cout << "Base class show() method" << std::endl;
}
};
class Derived : public Base {
public:
void show() {
std::cout << "Derived class show() method" << std::endl;
}
};
int main() {
Base baseObj;
Derived derivedObj;
Base* basePtr = &derivedObj;
baseObj.show(); // Вывод: Base class show() method
derivedObj.show(); // Вывод: Derived class show() method
basePtr->show(); // Вывод: Base class show() method
return 0;
}
Переопределение
- Определение: Когда метод базового класса, объявленный с ключевым словом
virtual
, переопределяется в производном классе. - Особенности: При переопределении метод базового класса остается доступным через указатель или ссылку на базовый класс, что обеспечивает динамический полиморфизм.
- Пример:
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class show() method" << std::endl;
}
virtual ~Base() {} // Виртуальный деструктор
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class show() method" << std::endl;
}
};
int main() {
Base baseObj;
Derived derivedObj;
Base* basePtr = &derivedObj;
baseObj.show(); // Вывод: Base class show() method
derivedObj.show(); // Вывод: Derived class show() method
basePtr->show(); // Вывод: Derived class show() method
return 0;
}
Использование override
:
Рекомендуется использовать ключевое слово override
для явного указания на переопределение метода базового класса.
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class show() method" << std::endl;
}
};