draw(); // должна быть где-то определена }; Функции-члены можно вызывать из
конструктора абстрактного класса, результат прямого или косвенного вызова чистой
виртуальной функции для объекта, созданного с помощью такого конструктора,
неопределен.
R.10.4 Сводка правил области видимости
Теперь можно свести воедино правила областей видимости для программы на С++.
Эти правила одинаково применимы для всех имен (включая имя-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); это значит, что его имя можно использовать только в