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

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудного Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

Московский технический университет связи и информатики

(МТУСИ)

Кафедра: "Математическая кибернетика и информационные технологии"

по дисциплине: «Языки программирования С/С++»

Доклад на тему: «Наследование, перегрузка, переопределение»

Выполнили: студенты группы

Проверил:

Кандидат технических наук, доцент Фатхулин Тимур Джалиевич

Москва, 2025

Содержание

Y

Содержание 2

1 Наследование 3

1.1 Типы наследования 4

1.2 Множественное наследование 6

1.3 Проблематика множественного наследования 6

1.4 Проблема ромбовидного наследования 8

1.5 Проблема ромбовидного наследования: Конструкторы и деструкторы 10

1.6 Интерфейс 11

1.7 Вывод по наследованию 12

2 Неявное приведение типов 12

3 Protected 14

4 Перегрузка 19

4.1 Правила перегрузки 22

5 Переопределение методов в C ++ 23

5.1 Требования для переопределения функции 24

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

6 Виртуальные методы и таблица виртуальных методов 25

6.1 Виртуальное наследование 30

6.2 Абстрактный класс 31

7 Виртуальные методы в конструкторе и деструкторе 32

Список использованных источников 36

1 Наследование

Наследование является одним из основополагающих принципов ООП. В соответствии с ним, класс может использовать переменные и методы другого класса как свои собственные.

Класс, который наследует данные, называется подклассом (subclass), производным классом (derived class) или дочерним классом (child). Класс, от которого наследуются данные или методы, называется суперклассом (super class), базовым классом (base class) или родительским классом (parent). Термины “родительский” и “дочерний” чрезвычайно полезны для понимания наследования. Как ребенок получает характеристики своих родителей, производный класс получает методы и переменные базового класса.

Наследование полезно, поскольку оно позволяет структурировать и повторно использовать код, что, в свою очередь, может значительно ускорить процесс разработки. Несмотря на это, наследование следует использовать с осторожностью, поскольку большинство изменений в суперклассе затронут все подклассы, что может привести к непредвиденным последствиям.

В этом примере, метод turn_on() и переменная serial_number не были объявлены или определены в подклассе Computer. Однако их можно использовать, поскольку они унаследованы от базового класса.

Важное примечание: приватные переменные и методы не могут быть унаследованы.

Листинг №1.1 – Программный код пример наследования

#include <iostream>

using namespace std;

class Device {

public:

int serial_number = 12345678;

void turn_on() {

cout << "Device is on" << endl;

}

private:

int pincode = 87654321;

};

class Computer : public Device {};

int main() {

Computer Computer_instance;

Computer_instance.turn_on();

cout << "Serial number is: " << Computer_instance.serial_number << endl;

// cout << "Pin code is: " << Computer_instance.pincode << endl;

// will cause compile time error

return 0;

}

1.1 Типы наследования

В C ++ есть несколько типов наследования:

  • публичный (public)- публичные (public) и защищенные (protected) данные наследуются без изменения уровня доступа к ним;

  • защищенный (protected) — все унаследованные данные становятся защищенными;

  • приватный (private) — все унаследованные данные становятся приватными.

Для базового класса Device, уровень доступа к данным не изменяется, но поскольку производный класс Computer наследует данные как приватные, данные становятся приватными для класса Computer.

Листинг №1.1.1 – Программный код

#include <iostream>

using namespace std;

class Device {

public:

int serial_number = 12345678;

void turn_on() {

cout << "Device is on" << endl;

}

};

class Computer : private Device {

public:

void say_hello() {

turn_on();

cout << "Welcome to Windows 95!" << endl;

}

};

int main() {

Device Device_instance;

Computer Computer_instance;

cout << "\t Device" << endl;

cout << "Serial number is: " << Device_instance.serial_number << endl;

Device_instance.turn_on();

// cout << "Serial number is: " << Computer_instance.serial_number << endl;

// Computer_instance.turn_on();

// will cause compile time error

cout << "\t Computer" << endl;

Computer_instance.say_hello();

return 0;

}

Класс Computer теперь использует метод turn_on() как и любой приватный метод: turn_on() может быть вызван изнутри класса, но попытка вызвать его напрямую из main приведет к ошибке во время компиляции. Для базового класса Device, метод turn_on() остался публичным, и может быть вызван из main.