
- •Преобразование типов указателей
- •Операторы определения адреса и обращения по адресу
- •Указатели на константы и константные указатели
- •Арифметические действия с указателями
- •Одномерные и многомерные массивы.
- •Строки символов. Основные функции для работы со строками.
- •Перечисление.
- •Структура.
- •Объединения.
- •Битовые поля.
- •Тип данных bool. Тип данных wchar_t.
- •Способы передачи параметров в подпрограммы.
- •Операторы распределения памяти.
- •Объявление typedef.
- •Оператор sizeof.
- •Передача аргументов по умолчанию.
- •Встроенные функции.
- •Определение пространства имён.
- •Оператор разрешения области видимости.
- •Объявление «using». Директива «using». Псевдонимы.
- •Механизм обработки исключений.
- •Вложенные исключения.
- •Определение класса.
- •Указатель this. Спецификаторы доступа к членам класса.
- •«Друзья» класса.
- •Конструктор класса. Список инициализации.
- •Конструктор по умолчанию.
- •Конструктор копирования.
- •Явные конструкторы.
- •Деструкторы.
- •Встроенные функции–члены класса. Статические члены класса.
- •Функции-члены класса с квалификаторами const и volatile.
- •Вложенные классы. Локальные классы.
- •Общие правила перегрузки операторов.
- •Перегрузка оператора присваивания.
- •Оператор индексирования [].
- •Перегрузка бинарных операторов.
- •Составные операторы присваивания.
- •Оператор вызова функции.
- •Операторы преобразования типов (конверторы).
- •Структура данных – стек.
- •Структура данных – очередь.
- •Деревья.
- •Наследование
- •Доступ к членам наследуемого класса
- •Конструкторы, деструкторы и наследование
- •Наследование и присваивание.
- •Виртуальные функции.
- •Полиморфизм и позднее связывание.
- •Передача аргументов по умолчанию в виртуальные функции.
- •Виртуальные деструкторы.
- •Абстрактные классы.
- •Множественное наследование.
- •Виртуальное наследование.
Доступ к членам наследуемого класса
При определении производного класса можно также определить права доступа к членам, наследуемым от базового класса. Для этого в определении производного класса перед именем базового класса записывается один из спецификаторов доступа: public, protected или private. Если класс наследуется как public, то права доступа к public и protected членам, наследуемым от базового класса, в производном классе не изменяется.
Если класс наследуется как protected, то все public и protected – члены базового класса, становятся protected-членами производного класса.
Если класс наследуется как private, то все public и protected – члены, наследуемые от базового класса, становятся private-членами производного класса.
В любом случае private-члены базового класса становятся private-членами производного класса. При чем доступ к этим членам закрыт в производном классе. Чтобы открыть этот доступ, производный класс должен быть объявлен другом базового класса. Если спецификатор доступа перед базовым классом опущен, то по умолчанию для классов он устанавливается в private, а для структур – в public.
Конструкторы, деструкторы и наследование
Конструкторы не наследуются, но при создании нового объекта производного класса, компилятор всегда вызывает конструктор по умолчанию базового класса. Чтобы изменить такую инициализацию объекта производного класса, нужно в списке инициализаций конструктора производного класса явно вызвать требуемый конструктор базового класса.
При инициализации любого объекта конструкторы вызываются в следующем порядке:
Конструкторы базовых классов. Если таких классов несколько, то и конструкторы вызываются в порядке следования этих классов в списке базовых классов.
Конструкторы объектов членов класса. Если таких объектов несколько, то и конструкторы вызываются в порядке объявления этих объектов класса.
Конструктор производного класса.
Деструкторы не наследуются, но при уничтожении объекта всегда вызываются деструкторы базовых классов в порядке, обратном вызову конструкторов.
Наследование и присваивание.
В языке программирования С++ базовый класс совместим по типу со всеми производными от него классами, поэтому объекты производных классов можно присваивать объекту базового класса, но не наоборот.
Операторы присваивания не наследуются, т.к. при отсутствии оператора присваивания в производном классе компилятор генерирует для этого класса оператор присваивания по умолчанию, который вызывает операторы присваивания для базовых классов и выполняет тривиальное копирование членов данного производного класса.
Виртуальные функции.
Язык программирования С++ обеспечивает механизм для вызова функции производного класса в случае, если доступ к объекту производного класса осуществляется через указатель или ссылку на базовый класс. Для этого в производном классе должна быть определена функция, имя и набор параметров которой совпадают с именем и набором параметров функции базового класса. Причем функция базового класса должна быть объявлена со спецификатором virtual. В этом случае говорят, что функция производного класса замещает функцию базового класса.
Замечание: 1. Повторять ключевое слово virtual в производном классе при замещении функции базового класса не обязательно.
функция, объявленная в базовом классе со спецификатором virtual, а также все функции, замещающие её в производных классах, называются виртуальными. Виртуальная функция не может быть статическим членом класса.
если виртуальные функции базового и производного классов отличаются только типом возвращаемого значения, то компилятор выдаст ошибку. Но при этом следует учитывать, что указатель и ссылка на базовый класс совместимы по типам с указателем и ссылкой на производный класс соответственно. Поэтому виртуальная функция производного класса может возвращать соответственно указатель или ссылку на класс, который является производным от класса, указатель или ссылку на который возвращает замещаемая виртуальная функция базового класса.
если виртуальная функция производного класса имеет такое же имя, что и виртуальная функция базового класса, но другой список параметров, то виртуальная функция в производном классе просто скрывает соответствующую виртуальную функцию в базовом классе.