Создание объектов и задание их начальных состояний




2 Вопроса:

1) Какими средствами задаются объекты в классах С++?

2) Почему и как нужно проектировать конструкторы?

Тезисы:

1) Общие сведения о конструкторах считаются известными (УВП).

2) В дальнейшем изложении основное внимание будет уделено реализации модели ООП конструкторами С++.

 

Возможности конструкторов класса С++ для реализации модели ООП

1. Для создания объектов в С++ существуют средства, называемые конструкторами, которые создают некоторые сущности, называемые экземплярами класса.

2. Сущность, создаваемая конструктором, есть область памяти (С++ ориентирован на память),

- разделенная на части для размещения членов класса

- наделенная правилами системы типов (функция или данное принадлежит какому-либо типу)

- снабженное правилами доступа

3. Конструктор, создавая описанную сущность, устанавливает для нее отношение "быть экземпляром класса".

4. Конструктор класса С++

- может задавать значение всех членов-данных, т.е. задавать состояние объекта полностью

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

- может не задавать никаких значений членов-данных

5. Предоставленный компилятором по умолчанию конструктор не задает целенаправленно значений членов-данных.

6. Если конструктор задает значения всех членов-данных, то он создает объект в смысле модели ООП и устанавливает отношение «быть объектом класса».

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

8. С++ позволяет программисту задать как состояние объекта, так и способ формирования этого состояния.

9. В классе С++ может быть определено несколько конструкторов, что обеспечивается имеющимися в С++ правилами переопределения функций.

 

24. Создание объектов прямым заданием значений членов-данных

 

10. Конструктор С++ позволяет создавать объекты с прямым заданием значений членов-данных.

11. Прямое задание реализуется:

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

- задание значений членов-данных с использованием параметров конструктора

- списки инициализации

Задание значений членов-данных с использованием списка инициализации.

 

Ситуация прямого задания характеризуется:

1) Отсутствием объекта того же или другого класса

2) В теле конструктора или в списке инициализации программист указывает и член - данное, и требуемое для него значение.

 

 

Способ задания Используемый объект Описание информации о значениях атрибутов значений Вид конструктора, реализующего способ задания Способ вызова конструктора Ссылка на примеры
           
Прямое задание членов данных Отсутствует Единственный полный набор значений членов-данных Конструктор без параметров с присваиванием значений набора в теле конструктора Без параметров  
Полный набор без приоритетных значений С параметрами без значений по умолчанию С параметрами  
Полный набор значений параметров, но для части значений заданы приоритетные значений С параметрами, часть которых, после некоторого, имеет приоритетные значения С параметрами, все из которых после некоторого имеют значения по умолчанию  
Полный набор для всех имеется приоритетные значения С параметрами все имеют приоритетные значения С параметрами и без параметров  

 

25. Создание объектов копированием

 

12. Конструктор С++ может создать объект класса путем создания точной или измененной копии объекта того же класса.

13. Эта возможность реализуется путем создания программистом конструктора копирования, при этом параметров этого конструктора программист может добиться изменения полученной копии.

14. С++ позволяет программисту определить конструктор копирования с несколькими параметрами. При этом первый параметр должен иметь вид:

(1) имя_класса &имя_объекта

------------------ принадлежит тому же классу, что и конструктор

(2) const имя_класса &имя_объекта

Все последующие параметры списка должны должны обязательно иметь значение по умолчанию.

Если программист сам определяет конструктор копирования, то действия по копированию или по изменению он должен задать сам.

Предоставляемый компилятором по умолчанию конструктор копирования создает точную копию объекта путем побитового переписывания памяти.

 

Пример:

Class Point

{

int X; int Y;

//...

public:

Point () {X=1; Y=2;}

Point (int X0, int Y0) {X=X0; Y=Y0;}

Point (int X0): X(X0), Y(1) { }

Point (const Point &Q, int Y0=0) {X=Q.X; Y=Q.Y;}

}

 

 

Способ задания Используемый объект Описание информации о значениях атрибутов значений Вид конструктора, реализующего способ задания Способ вызова конструктора Ссылка на примеры
           
Копирование Того же класса Полный набор значений определяется копируемым объектов Конструктор копирования с одним значением – копируемым объектом С одним параметром  
Полный набор значений часть из которых определяется копируемым объектом, а часть из которых имеет приоритетные значения Копирования, с первым – копируемое значение, а остальные приоритетные значения С параметрами, первый – копируемый объект, а остальные со значениями по умолчанию.  

 

 

26. Создание объектов преобразованием

 

15. Программист имеет возможность создать объект класса путем преобразования объекта другого класса.

 

Пример: (тривиальный) конструктор преобразования объекта типа int в объект типа Point

Class Point

{

int X; int Y;

public:

Point (int X0, int Y0);

}

Пример: (не тривиальный)

Class Point

{

int X; int Y;

public:

Point (Square S);

}

 

Class Square

{

Point P;

Unsigned int W;

Public:

Point GetP() { return P; }

}

Point:: Point (Square S) { X=S.GetP(); }

 

16. В конструкторе С++ можно осуществить защиту значений параметров с использованием спецификатора const.

17. Конструктор класса С++ не может иметь идентификатор const и не может иметь спецификатор static.

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

 

Способ задания Используемый объект Описание информации о значениях атрибутов значений Вид конструктора, реализующего способ задания Способ вызова конструктора Ссылка на примеры
           
Преобразование объекта другого класса Объект другого класса Полный набор значений, задаваемый преобразуемым объектом Конструктор преобразования с одним значением – преобразуемым объектом С одним параметром  
Полный набор: часть значений задано преобразуемым объектом, часть по умолчанию Преобразования, с первым – преобразующее значение, а остальные приоритетные значения С параметрами, первый – преобразуемый объект, а остальные со значениями по умолчанию.  
Полный набор значений: часть задана преобразуемым объектом, часть без приоритетных значений, часть с приоритетными значениями Преобразования, первым параметром – преобразуемое значение, часть без приоритетных значений, часть со значениями по умолчанию. С параметрами: первый - преобразуемый объект, часть со значениями параметров, остальные со значениями по умолчанию.  
Полный набор: преобразуемый объект, остальные не имеют приоритетных значений Преобразования, первым параметром – преобразуемое значение, остальные приоритетных значений С параметрами: первый - преобразуемый объект, остальные со значениями параметров.  

 

 

27. Создание объектов класса, использующих объекты других классов в качестве членов-данных

 

В принципе, членом-данным класса может являться другой класс, указатель на другой класс или ссылка на другой класс. С указателями проблем не возникает вообще. С ссылками проблема имеется, поскольку любая ссылка – константа. Её нужно инициализировать в заголовке конструктора с помощью c-tor инициализации. С реальным объектом ещё большая беда – для него в заголовке конструктора включающего класса должен быть явно вызван конструктор с параметрами. Однако, если включаемый класс имеет конструктор по умолчанию, явного вызова в заголовке включающего класса можно не делать. И ещё: если класс содержит другие классы, то сначала создаются объекты включаемых классов в порядке объявления, а затем – объект включающего класса.

 

28. Проектирование конструкторов класса языка С++

 

  1. Язык С++ позволяет для класса создать набор конструкторов.
  2. Набор конструкторов м.б. задан для класса, определяется:

ü Информацией о способах создания и задания начальных значений.

ü Способы автоматического вызова конструкторов в программах на С++

ü Механизм переопределения функций на языке С++

Набор конструкторов должен представлять согласованную систему.

 

Пример.

Class Point

{

int x; int y;

public:

Point (int x0; int y0)

{x=x0; y=y0;}

}

 

class Square

{

Point P; //требуется конструктор без параметров

unsigned int w;

public:

Square (Point Q; unsigned int w0)

{P=Q; w=w0}

}

// основная программа

Point P(4,2);

Square (p,10);

 

Вывод: некорректность комбинации класс Point и класс Square не обеспечивает вызов конструктора без параметров, который требуется при создании подобъекта точка при создании объекта Квадрат.

 

 

  1. Автоматический вызов конструктора класса С++ реализуется в следующих случаях:

ü При объявлении объектов в некоторых формах и задании их начальных состояний.

Пусть Т – класс

x- объект класса Т

а – объект класса Т или другого класса

Т х

Т х(а)

Т х=а

Т х=Т(а)

 

ü При передаче объектов в качестве параметров в тело функции.

ü При возврате значения функции с использованием ее имени.

ü При создании объектов с помощью оператора new

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

  1. В рассмотренном примере возможны следующие случаи обеспечения его корректости:

4.1. Убрать из класса Point имеющийся там конструктор и добавить конструктор без параметров

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

4.3. Добавить в конструктор значения по умолчанию.

 

Задание 16. Теоретически, практически и экспериментально ответить на вопрос: если в классе объявлена функция без значений по умолчанию, можно ли добавить значения по умолчанию в 1) файле реализации

2) в файле использующем функцию

 

4.4. С технологической позиции предоставляется целесообразным сделать следующее: нужно задать вызов нужного конструктора до выполнения функции Квадрат. В С++ существует список инициализации.

Формат списка инициализации:

Имя_класса (список_параметров): имя_члена_данного (список выражений)

{

//тело конструктора

}

Пример:

 

// реализация возможности 4.4

 

Square (Point Q, unsigned int w0): P(Q1), w(w0)

{}

 

Примечание: С++ позволяет защитить передаваемые значения.

 

29. Принципы проектирования классов.

 

  1. Создание класса является задачей проектирования, решение которого зависит от:

ü Четкого и полного понимания содержания предметной области.

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

ü От опыта, интуиции и знаний проектировщика

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

 

Принципы проектирования классов.

 

  1. Принцип явного отображения объекта в предметной области.

 

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

 

  1. Принцип прямого (непосредственного) отображения объектов в проблемной(предметной) области.

 

Square

{Point P;

Unsigned int w;

}

 

Square

{

Int x; int y; /*координаты левой верхней вершины*/

MoveToPoint (PointQ);

}

 

  1. Принцип отсутствия дублирования.

Point

{

int x;

int y;

MoveToPoint(PointQ);

}

 

Члены-данные и члены-функции должны быть заданы так, чтобы исключить наличие членов-данных одинаковых по смыслу и форме.

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

 

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

Пользователь класса должен знать о классе только то, что позволяет его использовать.

Ограничение доступа организуется двумя действиями:

ü Ведением закрытой части класса, в которой помещается и члены-функции и члены-данные, к которым пользователь не имеет прямого доступа.

ü Ведение специальных функций для работы с членами закрытой части по правилам, установленных классом.

 

  1. Принцип функциональной структурности класса.

Определение класса должно содержать функции 4-х видов:

ü конструкторы

ü деструкторы

ü селекторы

ü модификаторы

При этом функции из каждой группы должны обеспечивать надежное использование объектов класса.

Реализация: конструкторы должны полностью задавать экземпляр объекта.

 

  1. Принцип общей простоты и наглядности.

Определение класса должно быть простым для понимания.

Общая простота для понимания обеспечивается организацией текста определения ориентированной на понимание.

Средства организации:

ü наглядные имена классов и членов;

ü компактность;

ü взаимное расположение и членов-данных и членов-функций

  1. Принцип локальной простоты и наглядности.

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

 

  1. Принцип модульности.

Части описания класса должны быть разделены на части так, чтобы каждая эта часть могла быть оформлена в виде одного файла.

 

Задание 17. Для каждого принципа привести примеры реализации принципа.

 

 

30. Проектирование класса по контракту.

 

  1. Основное назначение контракта это определить строго условие использования его потребителем.
  2. Условия использование задаются правами и обязанностями сторон.
  3. Класс предоставляет пользователю некоторые возможности определенные при каких-то условиях и гарантирует организацию этих возможностей при выполнении этих условий.
  4. Пользователь класса обязан выполнить условия, которые выдвигает класс для реализации возможностей.
  5. Возможности класса и условия их реализации описываются с помощью утверждений.
  6. Структуру контракта образуют

ü Предусловия для всех членов-функций

ü Постусловия для всех членов-функций

ü Инвариант для класса

  1. Предусловие для члена-функции класса – это высказывание о свойстве параметров и членов-данных, которые необходимы для выполнения ее назначения.
  2. Постусловие – это высказывание, описывающее свойство возвращаемое функцией значения, параметрах и членов-данных необходимых для реализации функции своего назначения.
  3. Инвариант класса определяет те свойства членов данных, которые присущи все объектам класса.

Инвариант класса – это утверждение, которое имеет значение "истина" тогда и только тогда, когда любой метод класса, вызванный

    • с агрументами, удовлетворяющий предусловию метода;
    • для объекта класса, атрибуты которого порождают значение "истина" инварианта класса,

порождает объект класса, с состояние, обеспечивающим значение "истина" инварианта класса.

  1. Контракт для класса – это утверждение, включающее пред и постусловия для всех функций + инвариант класса.
  2. Контракт предназначен для проверки условий, порождаемых задачей и структурой программы, разработанной для ее решения. Эти условия могут быть нарушены программой.
  3. Процесс составления контракта был подробно на практических занятиях и должен быть реализован при выполнении л/р.

 

31. Отношение наследования в концептуальной модели ООП. Графическое представление наследования.

 

  1. Ранее использование одним классом другого в форме отношения включения. Класс как модуль включал объект другого класса.
  2. Концептуальная модель ООП предоставляет вторую возможность использования другим классам. Другой класс входит в первый в качестве подмодели.

 

Наследование в концептуальной модели ООП.

 

  1. Идея наследования состоит в заимствовании одним классом другого класса. Сам класс – модель, он заимствует другой класс как подмодель.
  2. Пусть есть два класса В и Д. В связан с Д отношением наследования, тогда и только тогда, когда имя Д имеет в своем составе все атрибуты, методы и уровни доступа В.
  3. Когда Д имеет свои собственные атрибуты, методы и уровни доступа, отличные от В.
  4. Любой объект класса Д ведет себя также, как объект класса В и может быть использован вместо него в соответствующих местах программы => правило подстановки.
  5. Отношение наследования направлено от В к Д, т.к. базовый класс порождает.
  6. Осуществить первые 2 условия можно и без наследования: переписав В в Д., объект Д м..б. подставлен во фрагменты. Объект класс Д м.б. использован во всех местах, где описан класс В.
  7. Возможность подстановки фрагментов Д в В обусловлено:

ü Модель класса В обладает теми же возможностями, входит как подмодель в класс Д.

ü Модель В входит в класс Д полностью.

ü Действует правило подстановки.

  1. При построении Д используется две возможности:

ü Класс Д добавлен в В только методы (атрибуты не добавляются)

ü Класс Д добавлен в В и атрибуты и методы.

Эти два пути называются сценариями наследования.

  1. Семантика отношения наследования: модель класса Д включает полностью модель класса В. Класс Д получает все атрибуты и методы В. Класс Д может добавить свои атрибуты и методы в разных пропорциях. Объект класса Д может использоваться в тех участках программы, которые написаны для класса В.
  2. Существует два способа установления наследования.

ü Добавление новых атрибутов и методов (специализация)

ü Обобщение, т.е. выделение у нескольких классов общих атрибутов и методов для образования нового класса.

 
 


Пример.

class Point

{}

 

class Square

{

Point P;

}

 

Class Square: Point

{

// собственные для Square члены (атрибуты и методы)

}

 

Класс Квадрат – специализация класса Точка (больше деталей – более конкретно)

       
   
 


Все фигуры находятся в наследовании класса Точка

 

 
 

 


Обобщаем – выделяем отдельный класс.

Обобщение направлено от производного класса к базовому.

 

  1. Класс может заимствовать модели либо от одного, либо от нескольких классов.

В первом случае наследование простое, во втором – множественное.

 

Графическое представление наследование (язык UML)

 

Класс В

 

 

Класс Д

 

Направлено в сторону более общего.

 

       
   

 


32. Задание отношения наследования в языке С++

 

  1. В С++ класс, который служит для построения нового называется базовым, а класс который получается – производным.
  2. Смысл отношения наследования в С++ отличается от наследования в концептуальной модели. В С++ гораздо больше возможностей, чем в концептуальной модели ООП.

 

 

Вопросы:

В1. Какие классы могут выступать в качестве базовых?

В2. Как синтаксически задается отношение наследования?

В3. Что получает производный класс от базового?

В4. Что добавляет производный класс к базовому?

В5. Что может изменить производный класс в использовании модели базового класса в производном?

В6. Зависит ли структура и возможности (свойства) базового класса от наличия производного?

В7. Каковы возможности и способы доступа к членам базового класса из производного класса?

В8. Как выполняется конструктор базового класса?

В9. Как д.б. организованы конструкторы производного класса и как будут инициализироваться члены базового класса.

В10. Как выполняется конструктор производного класса?

В11. Как д.б. организован деструктор?

 

 

  1. Базовыми м.б. классы, определенные или объявленные как классы. Объявленные классы – хотя бы одна функция не определена.
  2. Для определения или объявления класса с помощью наследования м.б. построен производной класс.
  3. Формат задания отношения наследования.

 

  class имя_класса : спецификатор_доступа имя_класса
служебное слово, задающее производный класс имя производного класса знак, задающий отношение наследования спецификатор вида наследования имя базового класса
    база наследования
             

 

 

Спецификатор доступа: public, private, protected. Спецификатор может быть не указан, тогда по умолчанию используется private.

 

Пример.

 

class Point

{

Int x; int y;

public:

MoveToPoint(Point Q);

}

 

class Square: public Point

{

}

 

  1. Производный класс может добавить свои члены-данные и свои члены функции.

 

 

class Square: private Point

{

unsigned int w;

public:

unsigned int Area();

}

 

  1. Область видимости имен производного класса вложена в область видимости базового класса.

 

 

  1. В производном классе могут использоваться имена, совпадающие с именами в базовом классе.

 

Пример.

 

class Square: private Point

{

unsigned int w;

public:

void MoveToPoint(Point Q);

// имя MoveToPoint класса Point скрыто таким же именем класса Square

}

 

 

  1. На структуру базового класса может влиять факт, что у него уже есть или планируется производный класс.

 

Реализация влияния:

ü в базовом классе есть секция protected

ü наличие виртуальных функций в базовом классе

 

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

Появление виртуальных функций обусловлено необходимостью эффективной реализации правила подстановки.

 

 

33. Управление доступом в производном классе к членам базового класса

 

  1. В этом разделе речь будет идти о прямом непосредственном доступе функций производного класса к членам базового класса
  2. У членов базового класса существует перечень клиентов, которые "хотели бы" иметь доступ к этим членам.

Этими членами являются:

ü Функции-члены базового класса

ü Функции-члены производного класса

ü Функции вне базового и вне производного классов

ü Функции, дружественные к базовому классу

Замечание. В рамках данного курса дружественные функции рассматриваться не будут.

  1. На возможность прямого доступа влияют следующие обстоятельства.

ü Размещение членов в секциях базового класса

ü Вложение областей видимости базового и производного классов

ü Влияние спецификатора вида наследования

 

Возможности прямого доступа к членам базового класса, обусловленных ТОЛЬКО размещение в секциях базового класса и вложением видимости.

Размещение чл. в секциях базового класса   Вид клиента Открытая секция Защищенная секция Закрытая секция
Функции-члены базового класса имеют имеют имеют
Функции-члены производного класса имеют имеют не имеют
Функции вне базового и вне производного классов имеют не имеют не имеют

 

 

  1. На возможности прямого доступа к членам базового класса существенное влияние оказывают спецификаторы доступа.

Трансформация секций базового класса, обусловленная видом наследования.

 

Размещение чл. в секциях базового класса   Спецификатор наследования Открытая секция Защищенная секция Закрытая секция
Открытое наследование открытая защищенное нет доступа
Защищенное наследование защищенное защищенное нет доступа
Закрытое наследование закрытое закрытое нет доступа

 

 

  1. С++ при наличии возможности доступа к членам базового класса и сокрытие его имени членами производного класса позволяет открыть доступ к этому члену с использованием квалификационного имени.

 

Пример.

void Square:: MoveToPoint(Point Q)

{

Point::MoveToPoint(Q);

}

 

  1. Закрытые члены базового класса не обеспечивают прямой доступ со стороны функций производного класса.
  2. Спецификатор наследования public сохраняет статус в производном классе членов открытых и защищенных секций базового класса.
  3. Пользователь производного класса может использовать вызов открытые члены базового класса обращаться к объектам производного класса. Производный класс, рассматриваемый как тип, является почти подтипом типа базового класса.

Тип является подтипом некоторого типа тогда и только тогда, когда объекты подтипа являются объектами типа.

В С++ указатель или ссылка на объект производного класса м.б. автоматически преобразован в указатель или ссылку базового класса. Автоматически – без прямых действий программиста по контексту использования.

Открытое наследование реализует правило подстановки на уровне указателей или ссылок.

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

Защищенное и закрытое наследование требуют большей квалификации программиста.

Открытое наследование более соответствует модели ООП.

  1. Защищенное наследование переводит открытые и защищенные секции базового класса в защищенные секции производного класса, тем обеспечивая прямой доступ таких секций базового класса со стороны наследников, закрывая прямой доступ пользователям производного класса.
  2. Закрытое наследование переводит открытые и защищенные секции базового класса в закрытые секции производного класса. Такое наследование оставляет прямой доступ членам производного класса и закрывает его для пользователей и наследников производного класса.
  3. Защищенное и закрытое наследование делает недействительным отношение подстановки объекта производного класса вместо объекта базового класса.
  4. Уровень доступа к члену базового класса со стороны производного класса м.б. восстановлен до уровня, установленного в базовом классе.

class Point

{

Int x; int y;

public:

MoveToPoint(Point Q);

// эта функция будет нужна в производном классе, а остальные не нужны

}

 

class Square: private Point

{

unsigned int w;

public:

Point:: MoveToPoint;

}

 

Задание 17.

Теоретически и практически ответить на вопрос: если базовый класс имеет несколько функций с одним именем, о сколько восстановлений уровня доступа нужно написать? А если функции находятся в различных секциях базового класса?

 

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

 

  1. Уровень доступа, измененный спецификатором наследования, м.б. восстановлен, но не изменен.

 

34. Реализация сценариев наследования в классах языка С++.

 

  1. Наследование предназначено для создания нового класса на основе существующих, т.о. наследование является средством повторного использования.
  2. В концептуальной модели ООП в класс наследник передаются все атрибуты и все методы класса родителя. А так же м.б. добавлены в класс наследник свои методы и атрибуты. В С++ имеются большие возможности для создания нового класса путем наследования.
  3. В большинстве случаев новые классы создаются путем специализации существующих.
  4. При создании новых классов с помощью наследования м.б. использованы и практически используются два подхода.

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

ü Второй: производный класс создается на основе базового класса и при этом стремимся использовать фрагменты программы созданной для объектов базового класса для объектов производного класса.

  1. При построении производного класса на С++ можно управлять:

ü Набором используемых членов базового класса

ü Переопределением функций базового класса

ü Доступом к членам базового класса.

  1. Сценарием наследования называется набор способов, которыми в производном классе управляется доступ к членам базового класса.
  2. Обобщенные сценарии могут строиться с учетом:

ü Комбинации значений количества членов, количества переопределенных функций, количества используемых уровней доступа.

 

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

 

Виды сценариев наследования

 

Описание сценариев Реализация сценариев
Прямое использование членов базового класса Переопределение членов базового класса Изменение уровней доступа Виды наследования Дополнительные конструкции Ссылки на примеры
Всех/части/не использ. Всех/части/ не использ. Да/нет
             
  Всех Не использ. Нет Открытое Нет  
  часть часть Нет Открытое Нет  
  Не использ. часть Нет Открытое Разрешение областей видимости для членов базового класса  
  Не использ. часть да закрытое Восстановление уровня доступа для членов базового класса  

Задание 18. Дополнить таблицу ситуациями, возникшими в л/р 3 и к/р

 

 

35. Создание объектов производного класса и задание их начальных состояний: производный класс не имеет собственных членов-данных.

 

  1. Производный класс в С++ должен иметь конструктор для создания объектов производного класса.
  2. Конструктор производного класса должен выполнить:

ü Создать подобъект базового класса и возможно обеспечить его инициализацию

ü должен создать члены-данные производного класса и возможно обеспечить их инициализацию.

  1. Для создания подобъектов базового класса в объекте производного класса конструктор производного класса вызывает конструктор базового класса. Конструкторы базовых классов вызывается в порядке перечисления базовых классов в производном классе.
  2. На создание объекта производного класса влияют следующие обстоятельства:

ü структура производного класса

ü свойства конструктора базового класса

ü необходимость инициализации

 

 

  1. Таблица

 

Базовый класс Производный класс Ссылки на примеры
Конструкторы Члены-данные (наличие) Конструкторы
Количество Использование конструкторов Обеспечение инициализации членов Наличие определенного конструктора Вид конструктора Количество
                 
    Предоставляется по умолчанию Не обеспечивает (не соответствует модели ООП) Нет членов данных Синтаксически не требуется Предоставляется по умолчанию Минимальное кол-во 1  
    Вызывается без параметров, но имеющий параметры ? Отсутствуют Синтаксически не требуется 1) можно использовать предоставляемый по умолчанию 2) определяется программистом Минимальное кол-во 1  
    Имеющий параметры, но не допускающий вызов без параметров Обеспечивает Отсутствуют Обязательно Со списком инициализации подобъектов базового класса Минимальное кол-во 1  

 

 

  1. В случае 3 порождается необходимость специального вида конструктора производного класса. Особенность конструктора состоит в том, что он должен иметь список инициализации, в нем вызывается конструктор базового класса. Для <


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: