Ключевое

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


Перекрытие (сокрытие)

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