Читаем Справочное руководство по C++ полностью

Механизм виртуальности при вызове отключается, если есть явное уточнение имени с помощью оператора разрешения области видимости (§R.5.1), например:

class B { public: virtual void f(); };

class D: public B { public: void f(); };

void D::f() { /*… */ B::f(); }

Здесь обращение к f из D приводит к вызову B::f, а не D::f.

<p>R.10.3 Абстрактные классы</p>

Абстрактные классы дают средство для представления в языке общих понятий, таких, например, как фигура, для которых могут использоваться только конкретные их варианты, например, круг или квадрат. Кроме того абстрактный класс позволяет задать интерфейс, разнообразные реализации которого представляют производные классы.

Абстрактным называется класс, который можно использовать только как базовый для некоторого другого класса, т.е. нельзя создать никакого объекта абстрактного класса кроме того, который представляет базовый класс для некоторого производного класса. Класс считается абстрактным, если в нем есть хотя бы одна чистая виртуальная функция. При описании класса виртуальная функция описывается как чистая с помощью спецификации-чистой (§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(); // должна быть где-то определена

};

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

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

Теперь можно свести воедино правила областей видимости для программы на 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).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных