Страустрап Бьярн
Шрифт:
R.11.6 Доступ к виртуальным функциям
Правила доступа (§R.11) к виртуальной функции определяются ее описанием и на них не влияют правила доступа к к функции, которая позднее будет подавлять ее. Приведем пример:
Права доступа проверяются при самом вызове, используя тип выражения, обозначающее объект, для которого вызывается функция-член (в примере выше это B*). Доступ к функции-члену в классе, где она определена (D в примере выше), в общем случае неизвестен.
R.11.7 Множественный доступ
Если добраться до имени можно несколькими путями по графу, задающему множественное наследование, то право доступа этого имени считается максимальным из прав, получаемых на разных путях. Поясним это примером:
Поскольку W::f доступно в C::f по пути, связанному с общим наследованием из B, обращение является законным.
R.12 Специальные функции-члены
Некоторые функции-члены считаются специальными, поскольку они влияют на то, как объекты класса создаются, копируются и уничтожаются, и как значения одного типа преобразуются в значения другого типа. Часто такие функции вызываются неявно.
Эти функции-члены подчиняются обычным правилам доступа (§R.11). Например, описание конструктора со спецификацией protected гарантирует, что создавать объекты с его помощью смогут только производные классы и друзья.
R.12.1 Конструкторы
Конструктором называется функция-член, имя которой совпадает с именем класса, он используется для построения значений, имеющих тип данного класса. Если в классе есть конструктор, то каждый объект этого класса перед произвольным использованием будет инициализироваться, см. §R.12.6.
Конструктор может вызываться для объекта со спецификацией const или volatile. Сам конструктор нельзя описывать со спецификацией const или volatile (§R.9.3.1). Конструктор также не может иметь спецификацию virtual или static.
Конструкторы не наследуются, однако, стандартные конструкторы и конструкторы копирования при необходимости создаются транслятором (§R.12.8). Такие конструкторы являются общими.
Стандартным конструктором для класса X является такой конструктор класса X, который можно вызывать без параметров. Стандартный конструктор для класса X будет создан только тогда, когда для класса X не описано ни одного конструктора.
Конструктором копирования для класса X называется конструктор, который вызывается для копирования объекта класса X, т.е. вызывается с одним параметром типа X. Например, X::X(const X&) и X::X(X&, int=0) являются конструкторами копирования. Конструктор копирования создается только тогда, когда не описано ни одного конструктора копирования.