Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
19-22,37.docx
Скачиваний:
7
Добавлен:
21.09.2019
Размер:
44.88 Кб
Скачать
  1. Иерархия классов (умк);

Иерархия классов – это структура, состоящая из классов, связанных между собой отношением обобщения. Обобщение и наследование позволяют выявить аналогии между различными классами объектов, определяют многоуровневую классификацию объектов. Так, в графических системах могут существовать классы, определяющие обрисовку различных геометрических фигур: точек, линий (прямых, дуг окружностей и кривых, определяемых сплайнами), многоугольников, кругов и т.п. Обобщение позволяет выделить класс одномерные фигуры и считать классы прямая, дуга и сплайн подклассами класса одномерные фигуры, а класс одномерные фигуры - суперклассом классов прямая, дуга и сплайн. Легко видеть, что отношения "подкласс - суперкласс" (обобщение) и "суперкласс - подкласс" (наследование) транзитивны, что позволяет строить классификационные деревья.

Для начала рассмотрим пример объявления нескольких классов. В этом примере задаются отношения наследования между тремя классами (классы A, B, C). При этом C наследует свойства класса B, который, в свою очередь, является наследником класса A. В этом примере все члены классов объявляются со спецификатором public, к которому мы пока относимся (пока!) как к должному. В этих классах мы объявим самые простые варианты конструкторов и деструкторов. В настоящий момент нам важно исключительно их существование. #include <iostream.h>

class A {

public:

A(){};

~A(){};

int x0; int f0 () {return 1;};

class B : public A {

public:

B(){};

~B(){};

int x1;

int x2;

int xx;

int f1 () {return 100;};

int f2 () {return 200;};

};

class C : public B {

public:

C(){};

~C(){};

int x1;int x2;int x3;

int f1 () {return 1000;};

int f3 () {return 3000;};

void main () {

C MyObject;}

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

Класс может иметь одного или нескольких родителей или не иметь их вовсе Класс, у которого нет родителей, но есть потомки, называется базовым (base) или корневым (root), а тот, у которого нет потомков, - листовым (leaf). О классе, у которого есть только один родитель, говорят, что он использует одиночное наследование (Single inheritance); если родителей несколько, речь идет о множественном наследовании (Multiple inheritance).

В C++ различаются непосредственные и косвенные базовые классы. Непосредственный базовый класс упоминается в списке баз производного класса. Косвенным базовым классом для производного класса считается класс, который является базовым классом для одного из классов, упомянутых в списке баз данного производного класса. В нашем примере для класса C непосредственным базовым классом является B, косвенным - A.

  1. Способы создания и разрушения объектов (умк);

Как отмечалось выше объекты создаются как переменные соответствующих типов (в качастве типа указывается класс объекта):

Light lt; В процессе создания и удаления объектов в программе обязательно участвуют особые методы класса – конструктор и деструктор, назначение которых интуитивно понятно.

Конструктор – выделяет память для объекта и инициализирует данные-члены класса.

  • имя конструктора совпадает с именем класса;

конструктор не имеет возвращаемого значения (даже void);

  • классу без конструктора предоставляется конструктор по умолчанию;

  • при явно описанном конструкторе конструктор по умолчанию не генерируется;

  • конструкторы могут быть перегружены;

не могут быть описаны с ключевыми словами virtual, static, const, mutable, volatile;

  • не могут явно вызываться в программе;

  • частным случаем конструктора является конструктор копирования, у которого в аргументах передается ссылка на другой объект того же класса.

Деструктор – вызывается автоматически при разрушении объекта, его задача - освободить память и корректно уничтожить объект. имя деструктора также совпадает с именем класса но предваряется символом тильда "~" (~имя_класса);деструктор не имеет ни какого возвращаемого значения;не может быть описан как static, const, mutable, volatile;без явного задания генерируется деструктор по умолчанию;могут быть описаны как virtual - у всех производных классов деструкторы автоматически будут виртуальными;могут явно вызываться;

Ниже приведем объявление конструктора: ComplexType();

Определение пустого конструктора: ComplexType() { }

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

В классе может быть объявлено (и определено) несколько конструкторов. Их объявления должны различаться списками параметров. Такие конструкторы по аналогии с функциями называются перегруженными (или совместно используемыми). Транслятор различает перегруженные конструкторы по спискам параметров. В этом смысле конструктор не отличается от обычной функции-члена класса:

ComplexType(double rePar, double imPar); /* Объявление… */

ComplexType(double rePar, double imPar) { /*…*/ } /*Определение…*/

Конструктор вызывается не для объекта класса, как другие функции-члены, а для области памяти. Для её преобразования ("превращения") в объект класса.

Конструктор копирования (пример):

class demo {

char *p;

public:

demo(void) { p="NULL"; }

demo(char* s){ p=s; }

demo(demo& demo_o){ p=o.p; }

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