Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Магистратура Языки программирования С,C++ / Презентация №8 Наследование, перегрузка, переопределение.pptx
Скачиваний:
3
Добавлен:
17.03.2024
Размер:
4.93 Mб
Скачать

Переопределение методов

04

Определение

Если мы наследуем класс в производный класс и снова предоставляем определение для одной из функций базового класса внутри производного класса, то эта функция считается переопределенной, и этот механизм называется переопределением функции

Требования для переопределения

функции

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

Наследование должно быть класс.

Переопределяемая функция должна иметь одинаковое объявление как в базовом, так и в производном классе

У базового и производного класса совпадают имя, возвращаемый тип и список параметров.

22

Приме

р

В этом примере функция show() переопределяется в производном классе.

23

Привязка вызова функции к объектам класса

Подключение вызова функции к телу функции называется привязкой. Когда это делается до запуска программы, это называется ранним связыванием или статическим связыванием, или связыванием во время компиляции.

24

Виртуальные

05

методы

 

V

 

 

 

i

 

 

 

r

 

 

Виртуальный метод (виртуальная функция)

t

 

— это метод класса, который может быть

u

переопределён в классах-наследниках так, что

конкретная реализация метода для вызова

 

 

 

 

 

 

будет определяться во время исполнения.

 

a

 

 

l

 

 

 

25

#include <iostream>
class Gun /*Класс «Пистолет» с методом «Выстрелить»*/
{
public:
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 gun;
//gun.Shoot(); //Gun_pul gun_pul;
//gun_pul.Shoot(); Gun* pb = new Gun_pul;
pb->Shoot(); return 0;
}

Виртуальные

методыПредставим следующую задачу:

Необходимо создать класс «Пистолет». У данного класса реализован метод «Выстрелить», который включает в себя отображение одного выстрела.

От данного класса есть наследуемый класс «Пистолет – пулемет», который будет иметь тот же метод, что и родительский класс, но включать в себя отображение нескольких выстрелов.

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