
- •Содержание
- •1 Наследование
- •1.1 Типы наследования
- •1.2 Множественное наследование
- •1.3 Проблематика множественного наследования
- •1.4 Проблема ромбовидного наследования
- •1.5 Проблема ромбовидного наследования: Конструкторы и деструкторы
- •1.6 Интерфейс
- •1.7 Вывод по наследованию
- •2 Неявное приведение типов
- •4 Перегрузка
- •4.1 Правила перегрузки
- •5.1 Требования для переопределения функции
- •5.2 Привязка вызова функции к объектам класса
- •6 Виртуальные методы и таблица виртуальных методов
- •Принцип работы
- •6.1 Виртуальное наследование
- •6.2 Абстрактный класс
- •7 Виртуальные методы в конструкторе и деструкторе
- •Список использованных источников
6.2 Абстрактный класс
В С++, класс в котором существует хотя бы один чистый виртуальный метод (pure virtual) принято считать абстрактным. Если виртуальный метод не переопределен в дочернем классе, код не скомпилируется. Также, в С++ создать объект абстрактного класса невозможно — попытка тоже вызовет ошибку при компиляции.
Листинг №1.7.1 – Программный код
#include <iostream>
using namespace std;
class Device {
public:
void turn_on() {
cout << "Device is on." << endl;
}
virtual void say_hello() = 0;
};
class Laptop : public Device {
public:
void say_hello() {
cout << "Hello world!" << endl;
}
};
int main() {
Laptop Laptop_instance;
Laptop_instance.turn_on();
Laptop_instance.say_hello();
// Device Device_instance;
// will cause compile time error
return 0;
}
7 Виртуальные методы в конструкторе и деструкторе
Вызов конструкторов реализован же самом порядке, в каком классы следуют один за другим в иерархии классов. Поскольку базовый класс ничего не знает про свои производные классы, то его инициализация может быть отделена от инициализации производных классов и производится до их создания, так что конструктор базового класса вызывается перед вызовом конструктора производного класса.
В противоположность этому деструктор производного класса вызывается перед деструктором базового класса. Причину этого также легко понять. Поскольку уничтожение объекта базового класса влечет за собой уничтожение и объекта производного класса, то деструктор производного объекта должен выполняться перед деструктором базового объекта.
Листинг 7.1 – Пример программы с конструкторами и деструкторами
Рисунок 7.1 – Результат выполнения программы
Если в конструкторе или деструкторе определены виртуальные методы, принцип остается тем же.
Конструктор класса всегда работает в предположении, что его дочерние классы еще не созданы, поэтому он не имеет права вызывать функции, определенные в них. И для виртуальной функций ему ничего не остается, как только вызвать то, что определено в нем самом. Получается, что механизм виртуальных функций тут как-бы не работает, так как таблица виртуальных функций дочернего класса еще не перекрыла текущую таблицу.
В деструкторе наоборот. Деструктор знает, что во время его вызова все дочерние классы уже разрушены и вызывать у них ничего уже нельзя, поэтому он замещает адрес таблицы виртуальных функций на адрес своей собственной таблицы и благополучно вызывает версию виртуальной функции, определенной в нем самом.
Таким образом, можно сказать, что виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора.
Листинг 7.2 – Пример программы с виртуальными методами в конструкторах
Рисунок 7.2 – Результат выполнения программы
Список использованных источников
Лафоре Р. Объектно-ориентированное программирование в С++ – СПб.:Питер, 2003.
Павловская Т.А. C/C++ Программирование на языке высокого уровня. – СПб.:Питер, 2003.
Подбельский В.В. Язык С++: Учебное пособие.– М.: Финансы и статистика, 2000.
Страуструп Б. Язык программирования С++.– СПб.:Бином, 2002.
Microsoft Corporation. Разработка приложений на Microsoft Visual C++ 6.0. Учебный курс: Официальное пособие Microsoft для самостоятельной подготовки / Пер. с англ.- М.: Издательско-торговый дом «Русская Редакция», 2000. – 576 стр.: илл.
Довек, Ж. Введение в теорию языков программирования / Ж. Довек, Ж.-Ж. Леви. — М.: ДМК, 2016. — 134 c.
Дорогов, В.Г. Основы программирования на языке С: Учебное пособие / В.Г. Дорогов, Е.Г. Дорогова; Под общ. ред. проф. Л.Г. Гагарина. — М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2017. — 224 c.
Касаткин, А. И. Профессиональное программирование на языке Си: Oт Turbo-C к Borland C++: справ.пособие / А. И. Касаткин, А. Н. Вольвачев. – Минск : Выш. шк., 1992.
Павловская Т.А., Щупак Ю.А. Структурное программирование. Практикум. - СПб, Питер, 2003, - 240с.
Пахомов Б.И. C/C++ и Borland C++ Builder для начинающих. - СПб.: БХВ-Петербург, 2007. - 640 с.
Страуструп, Б. Язык программирования C++: Специальное издание / Б. Страуструп; Пер. с англ. Н.Н. Мартынов. — М.: БИНОМ, 2017. — 1136 c.
Холзнер, С. VisualC++ 6. Учебный курс / С. Холзнер. – СПб. : Питер, 1999.
Холингворт Дж. и др. C++ Builder 5. Руководство разработчика. Том 2. Сложные вопросы программирования.
METANIT Перегрузка операторов [Электронный ресурс]. URL: https://metanit.com/cpp/tutorial/5.14.php (дата обращения 1.03.2023).
Ашарина, И.В. Основы программирования на языках С и С++: Курс лекций для высших учебных заведений / И.В. Ашарина. — М.: Гор. линия-Телеком, 2018. — 208 c.
Баженова, И.Ю. Языки программирования: Учебник для студентов учреждений высш. проф. образования / И.Ю. Баженова; Под ред. В.А. Сухомлин. — М.: ИЦ Академия, 2018. — 368 c.
Вайнер, Р. С++ изнутри / Р. Вайнер, Л. Пинсон – Киев : ДиаСофт, 1993.
Пол, И. Объектно-ориентированное программирование с использованием С++ / И. Пол. – Киев : ДиаСофт, 1995.
Васильев А. Н. Программирование на C++ в примерах и задачах / М.: Эксмо 2022. — 368 c.
Фатхулин Т. Д. Курс лекций по дисциплине «Языки программирования С/С++», 2023.