Упражнение 18.30. Определите в классе Base
стандартный конструктор, конструктор копий и конструктор с параметром типа int
. Определите те же три конструктора в каждом производном классе. Каждый конструктор должен использовать свой аргумент для инициализации своей части Base
.
Резюме
Язык С++ применяется для решения широкого диапазона проблем: от требующих лишь нескольких часов работы до занимающих годы работы больших групп разработчиков. Некоторые из средств языка С++ наиболее полезны при создании крупномасштабных приложений. Имеется в виду обработка исключений, пространства имен и множественное или виртуальное наследование.
Обработка исключений позволяет отделить ту часть кода, где может произойти ошибка, от той части кода, где она обрабатывается. При передаче исключения выполнение текущей функции приостанавливается и начинается поиск ближайшей директивы catch
. Локальные переменные, определенные в покидаемых при поиске директив catch
функциях, удаляются в ходе обработки исключения.
Пространства имен — это механизм управления большими и сложными приложениями, формируемыми из кода, созданного независимыми поставщиками. Пространство имен является областью видимости, в которой могут быть определены объекты, типы, функции, шаблоны и другие пространства имен. Стандартная библиотека определена в пространстве имен std
.
С концептуальной точки зрения множественное наследование — довольно простое понятие: производный класс может быть унаследован от нескольких прямых базовых классов. Объект производного класса состоит из частей, представляющих собой внутренние объекты всех своих базовых классов. Концепция действительно проста, но на практике сопряжена со многими сложностями. В частности, наследование от нескольких базовых классов создает вероятность конфликтов имен и в результате порождает неоднозначные обращения к именам из базовых частей объекта.
Если класс происходит от нескольких непосредственных базовых классов, не исключена ситуация, когда эти классы сами могут иметь общий базовый класс. В таких случаях промежуточные классы могут применить виртуальное наследование, позволяющее другим классам иерархии, унаследовавшим тот же базовый класс, совместно использовать его внутренний объект. Таким образом, объект производного класса будет иметь только одну совместно используемую копию внутреннего объекта виртуального базового класса.
Термины
Безымянное пространство имен (unnamed namespace). Пространство имен, определенное без имени. К именам, определенным в безымянном пространстве имен, можно обращаться непосредственно, без оператора области видимости. Каждый файл имеет собственное, уникальное безымянное пространство имен. Имена в файле невидимы вне данного файла.
Блокtry
(try
block). Блок операторов, начинающийся ключевым словом try
и содержащий одну или несколько директив catch
. Если код в блоке try
передает исключение и одна из директив catch
соответствует типу переданного исключения, то переданное исключение будет обработано этим обработчиком. В противном случае исключение будет передано из блока try другому обработчику, далее по цепи вызовов.
Блок try
функции (function try
block). Используется для обработки исключений из списка инициализации конструктора. Ключевое слово try
располагается перед двоеточием, начинающим список инициализации конструктора (или перед открывающей фигурной скобкой тела конструктора, если список инициализации пуст), и завершается одной или несколькими директивами catch
, которые следуют после закрывающей фигурной скобки тела конструктора.
Виртуальное наследование (virtual inheritance). Форма множественного наследования, при котором производные классы совместно используют одну копию экземпляра базового класса, даже если в иерархии он встречается несколько раз.
Виртуальный базовый класс (virtual base class). Базовый класс, при наследовании которого было использовано ключевое слово virtual
. В объекте производного класса часть виртуального базового класса содержится только в одном экземпляре, даже если в иерархии этот класс присутствует несколько раз. При не виртуальном наследовании конструктор может инициализировать только непосредственный базовый класс (классы). При виртуальном наследовании этот класс мог бы быть инициализирован несколькими производными классами, которые должны предоставить инициализирующие значения для всех его виртуальных предков.
Выражениеthrow е
(передача исключения). Выражение, которое прерывает текущий поток выполнения. Каждый оператор throw
передает управление ближайшему окружающему блоку catch
, который способен обработать исключение переданного типа. Выражение е
будет скопировано в объект исключения.
Глобальное пространство имен (global namespace). Неявное пространство имен, содержащее все определения глобальных объектов, которыми обладает каждая программа.