Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

}

Обратите внимание на то, что функция

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

Подчеркнем, что класс, содержащий виртуальные функции, как правило, должен содержать виртуальный деструктор (как, например, класс

Shape
); см. раздел 17.5.2.

A.12.4.2.

Абстрактные классы

Абстрактный класс (abstract class) — это класс, который можно использовать только в качестве базового класса. Объект абстрактного класса создать невозможно.

Shape s; // ошибка: класс Shape является абстрактным

class Circle:public Shape {

public:

void draw; // замещает override Shape::draw

// ...

};

Circle c(p,20); // OK: класс Circle не является абстрактным

Наиболее распространенным способом создания абстрактного класса является определение как минимум одной чисто виртуальной функции (pure virtual function), т.е. функции, требующей замещения.

class Shape {

public:

virtual void draw = 0; // =0 означает "чисто виртуальная"

// ...

};

См. раздел 14.3.5.

Реже, но не менее эффективно абстрактные классы создаются путем объявления всех их конструкторов защищенными (

protected
); см раздел. 14.2.1.

A.12.4.3. Сгенерированные операции

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

• Конструктор по умолчанию.

• Копирующие операции (копирующее присваивание и копирующая инициализация).

• Деструктор.

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

struct D:B1, B2 {

M1 m1;

M2 m2;

};

Предполагая, что классы

B1
,
B2
,
M1
и
M2
определены, можем написать следующий код:

void f

{

D d; // инициализация по умолчанию

D d2 = d; //
копирующая инициализация

d = D; // инициализация по умолчанию,

// за которой следует копирующее присваивание

} // объекты d и d2 уничтожаются здесь

Например, инициализация объекта

d
по умолчанию выполняется путем вызова четырех конструкторов по умолчанию (в указанном порядке):
B1::B1
,
B2::B2
,
M1::M1
и
M2::M2
. Если один из этих конструкторов не определен или не может быть вызван, то создание объекта
d
невозможно. Уничтожение объекта
d
выполняется путем вызова четырех деструкторов (в указанном порядке):
M2::~M2
,
M1::~M1
,
B2::~B2
и
B1::~B1
. Если один из этих деструкторов не определен или не может быть вызван, то уничтожение объекта
d
невозможно. Каждый из этих конструкторов и деструкторов может быть либо определен пользователем, либо сгенерирован автоматически.

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

A.12.5. Битовые поля

Битовое поле (bitfield) — это механизм упаковки многих маленьких значений в виде слова или в соответствии с установленным извне битовым форматом (например, форматом регистра какого-нибудь устройства). Рассмотрим пример.

struct PPN {

unsigned int PFN: 22;

int: 3; // не используется

unsigned int CCA;

bool nonreacheable;

bool dirty;

bool valid;

bool global;

};

Упаковка битовых полей в виде слова слева направо приводит к следующему формату (см. раздел 25.5.5).

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

char
или
int
даже для представления одного бита. Причина заключается в том, что для извлечения бита из слова и для записи бита в слово без изменения других битов необходимо выполнить несколько инструкций (которые также хранятся где-то в памяти). Не пытайтесь создавать битовые поля для экономии памяти, если у вас нет большого количества объектов с очень маленькими полями данных.

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9