Изучение одной из базовых концепций ООП – наследовании классов в С++, заключающуюся в построении цепочек классов, связанных иерархически

Страницы работы

Фрагмент текста работы

ситуациях, когда необходимо, чтобы атрибуты базового класса, оставались закрытыми из вне, но были доступны в производном классе, то их необходимо объявляться как protected.

Спецификатор доступа protectedэквивалентен спецификатору private с единственным исключением: защищенная часть базового класса доступны для всех производных классов от базового класса. Но вне базового или производного класса защищенные часть недоступны.

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

Классы, находящиеся ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих классов.

Правила наследования различных методов:

I. Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию (без параметров). Сначала вызываются конструкторы базовых классов, начиная с самого верхнего уровня, а затем исполняется конструктор производного класса. В случае нескольких базовых классов их конструкторы вызываются в порядке объявления.

II. Операция присваивания не наследуется и, поэтому ее также требуется явно определить.

III. Деструкторы не наследуются, и если не описан деструктор в производном классе, он формируется по умолчанию и вызывает деструкторы всех базовых  классов. В деструкторе производного класса не требуется явно вызывать деструкторы базовых классов, это будет сделано автоматически. Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызову конструкторов: сначала вызывается деструктор производного класса, затем — деструктор базового класса.

Указатель на базовый класс,  может хранить как адрес объекта базового класса, так и адрес объекта производного от него класса. Причем через указатель на базовый класс, который указывает на объект производного класса, можно обращаться только к той части объекта, которые были унаследованы от базового класса. Если попытаться с помощью указателя обратиться к объектам самого производного класса, то компилятор выдаст ошибку. Указатель базового класса можно использовать для указания на объект производного класса, но обратное не возможно. Арифметические действия (++, --) над указателей связаны с типом данных при объявлении указателя. Следовательно, если он указывает на производный класс, то p++ все равно не будет показывать на следующий объект производного класса.

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

class имя_пр_кл : сп_доступа имя_баз_кл1, … , сп_доступа имя_баз_клN

{

//тело производного класса

};

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

Похожие материалы

Информация о работе