Читаем Язык программирования C++. Пятое издание полностью

Создание объекта производного класса подразумевает создание и инициализацию внутренних объектов всех его базовых классов. В случае одиночного наследования из (единого) базового класса (см. раздел 15.2.2) в списке инициализации конструктора производного класса можно передать значения только для прямых базовых классов:

// явная инициализация объектов обоих базовых классов

Panda::Panda(std::string name, bool onExhibit)

 : Bear(name, onExhibit, "Panda"),

   Endangered(Endangered::critical) { }

// неявное применение стандартного конструктора класса Bear для

// инициализации его внутреннего объекта

Panda::Panda()

 : Endangered(Endangered::critical) { }

Список инициализации конструктора позволяет передать аргументы каждому из прямых базовых классов, однако порядок выполнения конструкторов (constructor order) зависит от порядка их расположения в списке наследования класса. Порядок их расположения в списке инициализации конструктора не имеет значения. Объект класса Panda инициализируется следующим образом.

• Внутренний объект класса ZooAnimal, самого первого базового класса иерархии класса Panda, непосредственного базового для класса Bear создается первым.

• Внутренний объект класса Bear, первого непосредственного базового класса для класса Panda, инициализируется следующим.

• Внутренний объект класса Endangered, второго непосредственного базового класса для класса Panda, инициализируется следующим.

• Последней инициализируется наиболее производная часть класса Panda.

Унаследованные конструкторы и множественное наследование

По новому стандарту производный класс может наследовать свои конструкторы от одного или нескольких своих базовых классов (см. раздел 15.7.4). Нельзя наследовать тот же конструктор (т.е. конструктор с тем же списком параметров) от более чем одного базового класса:

struct Base1 {

 Base1() = default;

 Base1(const std::string&);

 Base1(std::shared_ptr);

};

struct Base2 {

 Base2() = default;

 Base2(const std::string&);

 Base2(int);

};

// ошибка: D1 пытается унаследовать D1::D1(const string&) от обоих

// базовых классов

struct D1: public Base1, public Base2 {

 using Base1::Base1; // наследует конструкторы от Base1

 using Base2::Base2; // наследует конструкторы от Base2

};

Класс, унаследовавший тот же конструктор от нескольких базовых классов, должен определить собственную версию этого конструктора:

struct D2: public Base1, public Base2 {

 using Base1::Base1; // наследует конструкторы от Base1

 using Base2::Base2; // наследует конструкторы от Base2

 // D2 должен определить собственный конструктор, получающий string

 D2(const string &s) : Base1(s), Base2(s) { }

 D2() = default; // необходимо, поскольку D2 определяет собственный

                 // конструктор

};

Деструкторы и множественное наследование

Как обычно, деструктор в производном классе отвечает за освобождение ресурсов, зарезервированных этим классом. Автоматически освобождаются члены только производного класса и всех базовых классов. Тело синтезируемого деструктора пусто.

Деструкторы всегда выполняются в порядке, обратном вызову конструкторов. В данном примере порядок вызова деструкторов будет следующим: ~Panda(), ~Endangered(), ~Bear(), ~ZooAnimal().

Функции копирования и перемещения при множественном наследовании

Как и в случае одиночного наследования, классы с несколькими базовыми классами, определяющими собственные конструкторы копирования, перемещения и операторы присвоения, должны копировать, перемещать и присваивать весь объект (см. раздел 15.7.2). Базовые части класса, производного от нескольких базовых, автоматически копируются, перемещаются и присваиваются, только если производный класс использует синтезируемые версии этих функций-членов. В синтезируемых функциях-членах управления копированием каждый базовый класс неявно создается, присваивается или удаляется с использованием соответствующего члена базового класса.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных

Все жанры