Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_OOP.docx
Скачиваний:
5
Добавлен:
21.09.2019
Размер:
59.42 Кб
Скачать
  1. Вложенные объекты.

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

  1. Вложенные классы.

Вложенным классом называется класс определенный внутри другого класса. Существует два подхода относительно применения таких классов. Некоторые считают, что класс должен быть компонентой максимально изолированной от других классов и применяют вложенные объекты. Другие – допускают применение вложенных классов, если это согласуется с его логикой. Функции-члены вложенных классов обычно размещают в том же файле, что и функции члены внешнего класса

  1. Множественное наследование (только для С++).

Определенный ранее класс называется базовым классом, а новый производным. После создания производный класс, в свою очередь, может стать базовым для другого класса. Прямой базовый класс – это базовый класс, из которого совершает явное наследование производный класс. Косвенный базовый класс наследуется из двух или более уровней выше. Если существует несколько уровней наследования, то говорят об иерархии классов. Производный класс, которому добавляется новая функциональность (а значит и новые члены), по размеру больше своего базового класса. Он более специфичен, чем базовый класс и представляет более специализированную группу объектов. Члены производного класса могут использовать открытые (public) и защищенные (protected) члены всех базовых классов. Члены производного класса могут иметь такие же имена, что и члены базовых классов. В этом случае для явного указания используется оператор разрешения области видимости :: (двойное двоеточие) с именем базового класса.

В языке С++ допускается наследование от многих базовых классов. В этом случае говорят множественном наследовании. При множественном наследовании объект производного класса, содержит подобъекты каждого из базовых классов. Перед именем базового класса в заголовке указан модификатор public, указывающий на то, что класс

является открытым базовым классом. Члены производного класса могут использовать открытые (public) и защищенные (protected) члены базового класса. Такое наследование называется открытым наследованием.

Если в заголовке класса перед именем базового класса установлен модификатор protected (защищенный), то это приведет к тому, что все открытые (public) и защищенные (protected) члены базового класса будут доступны только членам производного класса и членам производного от производного класса, но не доступны для прямого вызова из программы, как это было в случае открытого наследования.

В случае закрытого наследования (перед именем базового класса указывается модификатор private) действует такое же правило, что и при защищенном наследовании, но если такой производный класс выступит в качестве базового, то для нового производного класса не будут доступны член косвенного базового класса, даже если новое наследование было отрытым.

  1. Принципы преобразования типов.

В программировании переменной одного типа часто присваивается значение пе-

ременной другого типа. Например, как показано в следующем фрагменте программы,

мы могли бы присвоить переменной типа float значение типа i n t .

int i;

float f;

i = 10;

f = i; // float-переменной присваивается int-значение.

Если в инструкции присваивания смешиваются совместимые типы, значение с

правой стороны (от оператора присваивания) автоматически преобразуется в значение

"левостороннего" типа. Таким образом, в предыдущем фрагменте программы значение, хранимое в int-переменной i, преобразуется в значение типа float, а затем

присваивается переменной f. Но, поскольку в С# не все типы совместимы и действу-

ет строгий контроль типов, не все преобразования типов разрешены в неявном виде.

Например, типы bool и i n t несовместимы. Тем не менее с помощью операции при-

ведения типов все-таки возможно выполнить преобразование между несовместимыми

типами. Приведение типов — это выполнение преобразования типов в явном виде.

При присвоении значения одного типа данных переменной другого типа будет вы-

полнено автоматическое преобразование типов, если

• эти два типа совместимы;

• тип приемника больше (т.е. имеет больший диапазон представления чисел),

чем тип источника.

При соблюдении этих двух условий выполняется преобразование с расширением, или

расширяющее преобразование. Например, тип i n t — достаточно "большой" тип, чтобы

сохранить любое допустимое значение типа byte, а поскольку как i n t , так и byte —

целочисленные типы, здесь может быть применено автоматические преобразование.

Для расширяющих преобразований числовые типы, включая целочисленные и с

плавающей точкой, совместимы один с другим. Несмотря на возможность автоматического преобразования типов из long в double, обратное преобразование типов (из double в long) автоматически не выпол-

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

образования между типом decimal и f l o a t (или double), а также из числовых типов

в тип char (или bool). Кроме того, несовместимы и типы char и bool . Приведение к типу — это явно за-

данная инструкция компилятору преобразовать один тип в другой. Инструкция при-

ведения записывается в следующей общей форме:

(тип_приемника) выражение. Преобразование типов встречается не только в инструкциях присваивания, но и в

выражениях. В выражениях можно смешивать различные типы данных, если они со-

вместимы. Например, можно смешивать типы short и long, поскольку это числовые

типы. При смешении различных типов в одном выражении все его составляющие

преобразуются к одному типу, причем это происходит по мере перехода от одной опе-

рации к другой.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]