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

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

Абстрактным называется класс, который можно использовать только как базовый для некоторого другого класса, т.е. нельзя создать никакого объекта абстрактного класса кроме того, который представляет базовый класс для некоторого производного класса. Класс считается абстрактным, если в нем есть хотя бы одна чистая виртуальная функция. При описании класса виртуальная функция описывается как чистая с помощью спецификации-чистой (§R.9.2). Чистую виртуальную функцию не нужно определять, если только она явно не вызывается с помощью конструкции уточненное-имя (§R.5.1). Рассмотрим пример:

class point {/*… */};

class shape {//
абстрактный класс

 point center;

 //…

public:

 point where { return center; }

 void move(point p) { center=p; draw; }

 virtual void rotate(int) = 0; // чистая виртуальная

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

 //…

};

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

shape x; // ошибка: объект абстрактного класса

shape* p; // нормально

shape f; // ошибка

void g(shape); // ошибка

shape& h(shape&); // нормально

Чистые виртуальные функции и наследуются как чистые виртуальные функции, например:

class ab_circle: public shape {

 int radius;

public:

 void rotate(int) {}

 ab_circle::draw; // чистая виртуальная функция

};

Поскольку функция shape::draw является чистой виртуальной функцией, то такой же будет по определению и функция ab_circle::draw. Для приведенного ниже описания класс circle не будет абстрактным, и у функции circle::draw где-то должно существовать определение.

class circle: public shape {

 int radius;

public:

 void rotate(int) {}

 void draw; // должна быть где-то определена

};

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

R.10.4 Сводка правил области видимости

Теперь можно свести воедино правила областей видимости для программы на C++. Эти правила одинаково применимы для всех имен (включая имя-typedef (§R.7.1.3) и имя-класса (§R.9.1)) и в любом контексте, для которого они допустимы по синтаксису языка. Здесь рассматриваются только области видимости на лексическом уровне, вопросы связывания обсуждаются в §R.3.3. Понятие момента описания было введено в §R.3.2.

Всякое использование имени должно быть однозначным (не считая перегрузки) в области его видимости (§R.10.1.1). Правила доступа (§R.11) начинают действовать только тогда, когда имя можно однозначно найти в области его видимости. Только при условии, что права доступа к имени не нарушены,

начинается проверка типа объекта, функции или элемента перечисления.

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

Имя, задаваемое после X:: или obj., где obj типа X или типа ссылка на X, а также имя, задаваемое после ptr-›, где ptr типа указатель на X, должно быть именем члена класса X или членом базового по отношению к X класса. Помимо этого, в обращении ptr-›имя ptr может быть объектом класса Y, в котором есть функция operator-›, описанная таким образом, что ptr-›operator в конечном счете оказывается указателем на X (§R.13.4.6).

Имя, которое не уточняется одним из описанных выше способов, и, которое используется в функции, не являющейся членом класса, должно быть описано в том блоке, где оно используется, или в объемлющем блоке или должно быть глобальным. Описание локального имени скрывает описания того же имени в объемлющих блоках, а также его описания как глобального имени. В частности, перегрузка имени невозможна для имен в разных областях видимости (§R.13.4).

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

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

Имя формального параметра функции, заданное при ее определении (§R.8.3), принадлежит области видимости, совпадающей с наибольшим блоком функции (в частности, является локальным именем). Имя формального параметра функции, заданное в ее описании (§R.8.2.5), а не определении, принадлежит локальной области видимости, которая исчезает сразу же после описания функции. Стандартные значения параметров находятся в области видимости, определяемой в момент описания (§R.3.2) формальных параметров функции; в них не должны использоваться локальные переменные или нестатические члены класса, и они вычисляются при каждом вызове функции (§R.8.2.6).

Инициализатор-ctor (§R.12.6.2) вычисляется в области видимости наибольшего блока конструктора, для которого он задан. В частности, в нем можно использовать имена формальных параметров.

R.11 Контроль доступа к членам

Член класса может быть:

• частным (private); это значит, что его имя можно использовать только в функциях-членах и друзьях класса, в котором он описан;

• защищенным (protected); это значит, что его имя можно использовать только в функциях-членах и друзьях класса, в котором он описан, а также в функциях-членах и друзьях классов, являющихся производными по отношению к этому классу (см. §R.11.5);

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

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Вы не прошли собеседование

Олешкевич Надежда
1. Укротить миллионера
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Вы не прошли собеседование

Курсант: назад в СССР 9

Дамиров Рафаэль
9. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: назад в СССР 9

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Барон Дубов 4

Карелин Сергей Витальевич
4. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 4

Волхв пятого разряда

Дроздов Анатолий Федорович
2. Ледащий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волхв пятого разряда

S-T-I-K-S. Окаянный

Текшин Антон
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.38
рейтинг книги
S-T-I-K-S. Окаянный

Имперский Курьер

Бо Вова
1. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперский Курьер

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

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

Я подарю тебе ребёнка

Малиновская Маша
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Я подарю тебе ребёнка

Его нежеланная истинная

Кушкина Милена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Его нежеланная истинная

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7