Ключевое
Перекрытие (сокрытие) функций-членов означает, что метод производного класса скрывает метод базового класса с таким же именем. Переопределение функций-членов означает, что производный класс предоставляет свою реализацию виртуального метода базового класса.
Перекрытие (сокрытие)
- Определение: Когда метод базового класса скрывается (перекрывается) методом производного класса с таким же именем и сигнатурой, но без ключевого слова 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;
    }
};