- •Содержан
- •Класс А
- •Метод turn_on()
- •Приватные данные
- •Множественное наследование
- •Проблематика множественного наследования
- •Проблема ромбовидного наследования
- •Проблема ромбовидного наследования
- •Проблема ромбовидного наследования: Конструкторы и деструкторы
- •Интерфейс
- •Неявное приведение
- •Неявное приведение типов
- •Protecte
- •Protecte
- •Protected
- •Protecte
- •Protecte
- •Перегрузка 03
- •Пример перегрузки
- •Правила
- •Переопределение методов
- •Приме
- •Привязка вызова функции к объектам класса
- •Виртуальные
- •Виртуальные
- •Виртуальные
- •Таблица виртуальных методов
- •Виртуальное наследование
- •Абстрактный класс
- •Виртуальные методы в конструкторе и деструкторе
- •Конструкторы &
- •Виртуальные методы в конструкторе и деструкторе
- •Спасибо за внимание
Переопределение методов |
04 |
Определение
Если мы наследуем класс в производный класс и снова предоставляем определение для одной из функций базового класса внутри производного класса, то эта функция считается переопределенной, и этот механизм называется переопределением функции
Требования для переопределения
функции
Переопределение функций не может быть выполнено внутри класса. Для этого нам требуются производный класс и базовый
Наследование должно быть класс.
Переопределяемая функция должна иметь одинаковое объявление как в базовом, так и в производном классе
У базового и производного класса совпадают имя, возвращаемый тип и список параметров.
22
Приме
р
В этом примере функция show() переопределяется в производном классе.
23
Привязка вызова функции к объектам класса
Подключение вызова функции к телу функции называется привязкой. Когда это делается до запуска программы, это называется ранним связыванием или статическим связыванием, или связыванием во время компиляции.
24
Виртуальные |
05 |
|
методы |
||
|
V |
|
|
|
|
i |
|
|
|
|
r |
|
|
Виртуальный метод (виртуальная функция) |
|
t |
|
— это метод класса, который может быть |
||
u |
переопределён в классах-наследниках так, что |
|||
конкретная реализация метода для вызова |
||||
|
|
|
||
|
|
|
будет определяться во время исполнения. |
|
|
a |
|||
|
|
l |
||
|
|
|
25 |
Виртуальные
методыПредставим следующую задачу:
Необходимо создать класс «Пистолет». У данного класса реализован метод «Выстрелить», который включает в себя отображение одного выстрела.
От данного класса есть наследуемый класс «Пистолет – пулемет», который будет иметь тот же метод, что и родительский класс, но включать в себя отображение нескольких выстрелов.
26
Виртуальные
методы
#include <iostream> |
Виртуальные методы объявляются с помощью оператора virtual, |
class Gun /*Класс Пистолет с методом "Выстрелить"*/ |
определяющиеся в вершине дерева наследования, где они |
встречается впервые. Писать virtual в потомках уже не |
|
{ |
обязательно. |
public: |
|
virtual void Shoot() |
|
{ |
|
std::cout << "BANG!\n"; |
|
} |
|
}; |
|
class Gun_pul : public Gun /*Класс Пистолет- пулемет с |
|
методом "Выстрелить"*/ |
|
{ |
|
public: |
|
void Shoot() |
|
{ |
|
std::cout << "BANG! BANG! BANG!\n"; |
|
} |
|
}; |
|
int main() |
|
{ |
|
setlocale(LC_ALL, "ru"); |
|
Gun* pb = new Gun_pul; |
|
pb->Shoot(); |
|
return 0; |
|
} |
|
27
Таблица виртуальных методов
28
Виртуальное наследование
Виртуальное наследование (virtual inheritance) предотвращает появление множественных объектов базового класса в иерархии наследования.
29
Абстрактный класс
В С++, класс в котором существует хотя бы один чистый виртуальный метод (pure virtual) принято считать абстрактным.
30
Виртуальные методы в конструкторе и деструкторе
Вызов конструкторов реализован же самом порядке, в каком классы следуют один за другим в иерархии классов.
В противоположность этому деструктор производного класса вызывается перед деструктором базового класса
3
1