Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

14.6 Указатель на себя

Каждый объект имеет указатель на себя, который обозначается идентификатором this. Он является скрытым параметром каждой функции-компоненты. Для объекта list указатель this имеет тип:

list *const this .

Функцию-компоненту можно объявить так, чтобы поля объекта были доступны ей только для чтения

int readme() const {/*тело функции*/};

Указатель this, передаваемый такой функции, будет иметь тип:

const list *const this.

Вопросы

1. Чем является класс: переменной, типом данных, программным модулем?

2. Чем отличается внутреннее и внешнее определение функций-компонент?

3. Каковы соглашения о видимости компонент класса, структуры, объединения, принятые по умолчанию?

4. Какие конструкторы компилятор может построить без участия программиста?

5. Когда пустой конструктор требует явного определения?

6. В каком случае происходит автоматический вызов деструктора объекта?

7. Каково значение указателя this?

15 Производные классы

15.1 Простое наследование

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

П р и м е р базового и производного классов: рыбы и щуки.

class fish {

public:

int x, y, vx, vy;

fish(int x, int y): x(x), y(y) {};

void go();

void look();

void draw();

};

class pike: public fish {

int size;

public:

pike(int x, int y, int size);

void draw();

};

Конструкторы не наследуются. Если конструктор базового класса имеет параметры, он вызывается в списке инициализации производного конструктора.

Деструктор класса-наследника автоматически вызывает деструктор базового класса.

15.2 Списки инициализации

Элементы-данные класса обычно инициализируются в теле конструктора. Однако определение конструктора может включать список инициализации элементов.

pike(int x, int y, int size): fish(x,y),size(size) {};

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

З а м е ч а н и е. Список инициализации является единственным средством инициализации элементов-констант, элементов-ссылок и элементов-объектов, конструкторы которых имеют параметры.

15.3 Ключи доступа

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

class Derived: ключ_доступа Base1 [, ключ_доступа Base2,...] {...}

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

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

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

// базовый класс

class Base {

public:

void f1();

}

// производный класс

class Derived: private Base {

public:

Base::f1; // делает f1() снова публичным

}

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