﻿<?php
echo "<p class=bmenu><span class=MsoHyperlink><a href=\"#_Toc219968036\">Глава 7\n";
echo "Производные Классы<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>__ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>186</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968037\">7.1 Введение<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>186</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968038\">7.2 Производные Классы<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>187</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968039\">7.2.1\n";
echo "Построение Производного Класса<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>187</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968040\">7.2.2\n";
echo "Функции Члены<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>188</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968041\">7.2.3\n";
echo "Видимость<span style='color:windowtext;display:none;text-decoration:none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>190</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968042\">7.2.4\n";
echo "Указатели<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>191</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968043\">7.2.5\n";
echo "Иерархия Типов<span style='color:windowtext;display:none;text-decoration:none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>192</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968044\">7.2.6\n";
echo "Конструкторы и Деструкторы<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>193</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968045\">7.2.7 Поля\n";
echo "Типа<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>194</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968046\">7.2.8\n";
echo "Виртуальные Функции<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>195</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968047\">7.3 Альтернативные\n";
echo "Интерфейсы<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>197</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968048\">7.3.1\n";
echo "Интерфейс<span style='color:windowtext;display:none;text-decoration:none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>198</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968049\">7.3.2\n";
echo "Реализация<span style='color:windowtext;display:none;text-decoration:none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>198</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968050\">7.3.3 Как\n";
echo "Этим Пользоваться<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>200</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968051\">7.3.4\n";
echo "Обработка Ошибок<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>202</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968052\">7.3.5\n";
echo "Обобщенные Классы<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>203</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968053\">7.3.6\n";
echo "Ограниченные Интерфейсы<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>205</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968054\">7.4 Добавление к Классу<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>206</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968055\">7.5 Неоднородные Списки<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>207</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968056\">7.6 Законченная Программа<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>208</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968057\">7.6.1\n";
echo "Администратор Экрана<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>208</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968058\">7.6.2\n";
echo "Библиотека Фигур<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>210</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219968059\">7.6.3\n";
echo "Прикладная Программа<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>214</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968060\">7.7 Свободная Память<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>215</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219968061\">7.8 Упражнения<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>217</span></a></span></span></p>\n";
echo "\n";
echo "<h1><a name=\"_Toc219968036\">Глава 7 Производные Классы</a></h1>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:112.2pt;margin-bottom:.0001pt;text-autospace:none'>Не надо\n";
echo "размножать объекты без необходимости</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:336.6pt;text-autospace:none'>- У. Оккам</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В этой главе описывается понятие производного\n";
echo "класса в С ++. Производные классы дают простой, гибкий и эффективный ап­парат\n";
echo "задания для класса альтернативного интерфейса и опреде­ления класса посредством\n";
echo "добавления возможностей к уже имею­щемуся классу без перепрограммирования или\n";
echo "перекомпиляции. С помощью производных классов можно также обеспечить общий ин­терфейс\n";
echo "для нескольких различных классов так, чтобы другие части программы могли\n";
echo "работать с объектами этих классов оди­наковым образом. При этом обычно в каждый\n";
echo "объект помещается информация о типе, чтобы эти объекты могли обрабатываться со­ответствующим\n";
echo "образом в ситуациях, когда их тип нельзя узнать во время компиляции. Для\n";
echo "элегантной и надежной обработки та­ких динамических зависимостей типов имеется\n";
echo "понятие виртуаль­ной функции. По своей сути производные классы существуют для\n";
echo "того, чтобы облегчить программисту формулировку общности.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968037\">7.1 Введение</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Представим себе процесс написания некоторого\n";
echo "универсаль­ного средства (например, тип связанный список, таблица имен или\n";
echo "планировщик для системы моделирования), которое предназ­начается для использования\n";
echo "многими разными людьми в различных обстоятельствах. Очевидно, что в кандидатах\n";
echo "на роль таких средств недостатка нет, и выгоды от их стандартизации огром­ны.\n";
echo "Кажется, любой опытный программист написал (и отладил) дюжину вариантов типов\n";
echo "множества, таблицы имен, сортирующей функции и т.п., но оказывается, что каждый\n";
echo "программист и каж­дая программа используют свою версию этих понятий, из-за чего\n";
echo "программы слишком трудно читать, тяжело отлаживать и сложно модифицировать.\n";
echo "Более того, в большой программе вполне может быть несколько копий идентичных\n";
echo "(почти) частей кода для рабо­ты с такими фундаментальными понятиями.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Причина этого хаоса частично состоит в том, что предста­вить\n";
echo "такие общие понятия в языке программирования сложно с концептуальной точки\n";
echo "зрения, а частично в том, что средства, обладающие достаточной общностью,\n";
echo "налагают дополнительные расходы по памяти и/или по времени, что делает их\n";
echo "неудобными для самых простых и наиболее напряженно используемых средств\n";
echo "(связанные списки, вектора и т.п.), где они были бы наиболее полезны. Понятие\n";
echo "производного класса в С++, описываемое в #7.2, не обеспечивают общего решения\n";
echo "всех этих проблем, но оно дает способ справляться с довольно небольшим числом\n";
echo "важ­ных случаев. Будет, например, показано, как определить эффек­тивный класс\n";
echo "обобщенного связанного списка таким образом, чтобы все его версии разделяли\n";
echo "код.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Написание общецелевых средств - задача непростая, и час­то\n";
echo "основной акцент в их разработке другой, чем при разработке программ\n";
echo "специального назначения. Конечно, нет четкой границы между средствами общего и\n";
echo "специального назначения, и к мето­дам и языковым средствам, которые описываются\n";
echo "в этой главе, можно относиться так, что они становятся все более полезны с\n";
echo "ростом объема и сложности создаваемых программ.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968038\">7.2 Производные Классы</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы разделить задачи понимания аппарата языка и\n";
echo "мето­дов его применения, знакомство с понятием производных классов делается в\n";
echo "три этапа. Вначале с помощью небольших примеров, которые не надо воспринимать\n";
echo "как реалистичные, будут описаны сами средства языка (запись и семантика). После\n";
echo "этого демонс­трируются некоторые неочевидные применения производных клас­сов,\n";
echo "и, наконец, приводится законченная программа.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968039\">7.2.1 Построение Производного Класса</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Рассмотрим построение программы, которая имеет дело\n";
echo "с людьми, служащими в некоторой фирме. Структура данных в этой программе может\n";
echo "быть например такой:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct employee (* // </span>служащий</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* name; // </span>имя</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short age; // </span>возраст</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short department; // </span>подразделение</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int salary; // </span>жалование</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Список аналогичных служащих будет связываться через поле next. Теперь\n";
echo "давайте определим менеджера:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>struct\n";
echo "manager (* // менеджер</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>employee emp;\n";
echo "// запись о менеджере как о служащем</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>employee*\n";
echo "group; // подчиненные люди</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Менеджер также является служащим; относящиеся к\n";
echo "служаще­му employee данные хранятся в члене emp объекта manager. Для читающего\n";
echo "это человека это, может быть, очевидно, но нет ни­чего выделяющего член emp для\n";
echo "компилятора. Указатель на ме­неджера (manager*) не является указателем на служащего\n";
echo "(employee*), поэтому просто использовать один там, где требу­ется другой,\n";
echo "нельзя. В частности, нельзя поместить менеджера в список служащих, не написав\n";
echo "для этого специальный код. Мож­но либо применить к manager* явное\n";
echo "преобразование типа, либо поместить в список служащих адрес члена emp, но и то\n";
echo "и другое мало элегантно и довольно неясно. Корректный подход состоит в том,\n";
echo "чтобы установить, что менеджер является служащим с неко­торой добавочной\n";
echo "информацией:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct manager : employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* group;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'><span lang=EN-US>manager </span>является производным\n";
echo "от<span lang=EN-US> employee </span>и<span lang=EN-US>, </span>обратно<span\n";
echo "lang=EN-US>, employee </span>есть базовый класс для<span lang=EN-US> manager. </span>Класс\n";
echo "manager допол­нительно к члену group имеет члены класса employee (name, age и\n";
echo "т.д.).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Имея определения employee и manager мы можем теперь соз­дать\n";
echo "список служащих, некоторые из которых являются менедже­рами. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void f()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>manager m1, m2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee e1, e2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* elist;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>elist =          &amp;m1; // </span>поместить<span lang=EN-US> m1,\n";
echo "e1, m2 </span>и<span lang=EN-US> e2 </span>в<span lang=EN-US> elist</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>m1.next       = &amp;e1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>e1.next        = &amp;m2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>m2.next       = &amp;e2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>e2.next        =\n";
echo "0;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*) </p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Поскольку менеджер является служащим, manager*\n";
echo "может ис­пользоваться как employee*. Однако служащий необязательно является\n";
echo "менеджером, поэтому использовать employee* как manager* нельзя.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968040\">7.2.2 Функции Члены</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Просто структуры данных вроде employee и manager на\n";
echo "са­мом деле не столь интересны и часто не особенно полезны, поэ­тому\n";
echo "рассмотрим, как добавить в них функции. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* name;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class manager : public employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Надо ответить на некоторые вопросы. Как может\n";
echo "функция член производного класса manager использовать члены его базо­вого\n";
echo "класса employee? Как члены базового класса employee мо­гут использовать функции\n";
echo "члены производного класса manager? Какие члены базового класса employee может\n";
echo "использовать функ­ция не член на объекте типа manager? Каким образом програм­мист\n";
echo "может повлиять на ответы на эти вопросы, чтобы удовлет­ворить требованиям\n";
echo "приложения?</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Рассмотрим<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void manager::print()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot; </span>имя<span lang=EN-US> &quot; &lt;&lt;\n";
echo "name &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Член производного класса может использовать\n";
echo "открытое имя из своего базового класса так же, как это могут делать другие\n";
echo "члены последнего, то есть без указания объекта. Предполагает­ся, что на объект\n";
echo "указывает this, поэтому (корректной) ссыл­кой на имя name является\n";
echo "this-&gt;name. Однако функция manager:: print компилироваться не будет, член\n";
echo "производного класса не имеет никакого особого права доступа к закрытым членам\n";
echo "его базового класса, поэтому для нее name недоступно.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Это многим покажется удивительным, но представьте себе\n";
echo "другой вариант: что функция член могла бы обращаться к закры­тым членам своего\n";
echo "базового класса. Возможность, позволяющая программисту получать доступ к\n";
echo "закрытой части класса просто с помощью вывода из него другого класса, лишила бы\n";
echo "понятие зак­рытого члена всякого смысла. Более того, нельзя было бы уз­нать все\n";
echo "использования закрытого имени, посмотрев на функции, описанные как члены и\n";
echo "друзья этого класса. Пришлось бы прове­рять каждый исходный файл во всей программе\n";
echo "на наличие в нем производных классов, потом исследовать каждую функцию этих\n";
echo "классов, потом искать все классы, производные от этих клас­сов, и т.д. Это по\n";
echo "меньшей мере утомительно и скорее всего нереально.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>С другой стороны, можно ведь использовать механизм friend,\n";
echo "чтобы предоставить такой доступ или отдельным функци­ям, или всем функциям\n";
echo "отдельного класса (как описывается в #5.3). Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend void manager::print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>решило бы проблему с\n";
echo "manager::print(), и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend class manager;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>сделало бы доступным каждый член employee для всех\n";
echo "функ­ций класса manager. В частности, это сделает name доступным для\n";
echo "manager::print().</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Другое, иногда более прозрачное решение для производного\n";
echo "класса - использовать только открытые члены его базового класса. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void manager::print()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>employee::print(); \n";
echo "// печатает информацию о служащем</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...                                          //\n";
echo "печатает информацию о менеджере</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что надо использовать ::, потому что\n";
echo "print() была переопределена в manager. Такое повторное использование имен\n";
echo "типично. Неосторожный мог бы написать так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void manager::print()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>print(); //\n";
echo "печатает информацию о служащем</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ... //\n";
echo "печатает информацию о менеджере</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>и обнаружить,\n";
echo "что программа после вызова manager::print() неожиданно попадает в\n";
echo "последовательность ре­курсивных вызовов.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968041\">7.2.3 Видимость</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Класс employee стал открытым (public) базовым\n";
echo "классом класса manager в результате описания:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class manager : public employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Это означает, что открытый член класса employee является также и открытым\n";
echo "членом класса manager. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void clear(manager* p)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>p-&gt;next =\n";
echo "0;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>будет компилироваться, так как next - открытый член\n";
echo "и employee и manager'а. Альтернатива - можно определить закры­тый (private)\n";
echo "класс, просто опустив в описании класса слово public:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class manager : employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это означает, что открытый член класса employee\n";
echo "является закрытым членом класса manager. То есть, функции члены класса manager\n";
echo "могут как и раньше использовать открытые члены класса employee, но для\n";
echo "пользователей класса manager эти члены не­доступны. В частности, при таком\n";
echo "описании класса manager функция clear() компилироваться не будет. Друзья\n";
echo "производного класса имеют к членам базового класса такой же доступ, как и\n";
echo "функции члены.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Поскольку, как оказывается, описание открытых базовых\n";
echo "классов встречается чаще описания закрытых, жалко, что описа­ние открытого\n";
echo "базового класса длиннее описания закрытого. Это, кроме того, служит источником\n";
echo "запутывающих ошибок у на­чинающих.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Когда описывается производная struct, ее базовый класс по\n";
echo "умолчанию является public базовым классом. То есть,</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>struct D : B (* ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>означает</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class D :\n";
echo "public B (* public: ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Отсюда следует, что если вы не сочли полезным то\n";
echo "сокры­тие данных, которое дают class, public и friend, вы можете просто не\n";
echo "использовать эти ключевые слова и придерживаться struct. Такие средства языка,\n";
echo "как функции члены, конструкторы и перегрузка операций, не зависят от механизма\n";
echo "сокрытия дан­ных.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Можно также объявить некоторые, но не все, открытые чле­ны\n";
echo "базового класса открытыми членами производного класса. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class manager : employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee::name;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>employee::department;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>Запись</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>имя_класса :: имя_члена ;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>не вводит новый член, а просто делает открытый член\n";
echo "ба­зового класса открытым для производного класса. Теперь name и department\n";
echo "могут использоваться для manager'а, а salary и age</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-autospace:\n";
echo "none'>- нет. Естественно, сделать закрытый член базового класса от­крытым\n";
echo "членом производного класса невозможно. Невозможно с помощью этой записи также\n";
echo "сделать открытыми перегруженные имена.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Подытоживая, можно сказать, что вместе с предоставлением\n";
echo "средств дополнительно к имеющимся в базовом классе, производ­ный класс можно\n";
echo "использовать для того, чтобы сделать средства (имена) недоступными для пользователя.\n";
echo "Другими словами, с по­мощью производного класса можно обеспечивать прозрачный,\n";
echo "по­лупрозрачный и непрозрачный доступ к его базовому классу.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968042\">7.2.4 Указатели</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Если производный класс derived имеет открытый\n";
echo "базовый класс base, то указатель на derived можно присваивать пере­менной типа\n";
echo "указатель на base не используя явное преобразова­ние типа. Обратное\n";
echo "преобразование, указателя на base в указа­тель на derived, должно быть явным.\n";
echo "Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class base (* /* ... */ *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class derived :\n";
echo "public base (* /* ... </span>*/ *);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>derived m;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>base* pb =\n";
echo "&amp;m; // неявное преобразование</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>derived* pd =\n";
echo "pb; // ошибка: base* не является derived*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>pd = (derived*)pb; // явное\n";
echo "преобразование</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Иначе говоря, объект производного класса при работе\n";
echo "с ним через указатель и можно рассматривать как объект его ба­зового класса.\n";
echo "Обратное неверно.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Будь base закрытым базовым классом класса derived, неяв­ное\n";
echo "преобразование derived* в base* не делалось бы. Неявное преобразование не может\n";
echo "в этом случае быть выполнено, потому что к открытому члену класса base можно\n";
echo "обращаться через ука­затель на base, но нельзя через указатель на derived:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class base (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int m1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int m2; // m2 - </span>открытый член<span lang=EN-US> base</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class derived : base (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// m2 - НЕ\n";
echo "открытый член derived</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>derived d;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>d.m2 = 2; //\n";
echo "ошибка: m2 из закрытой части класса</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>base* pb =\n";
echo "&amp;d; // ошибка: (закрытый base)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>pb-&gt;m2 =\n";
echo "2; // ok</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>pb =\n";
echo "(base*)&amp;d; // ok: явное преобразование</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>pb-&gt;m2 = 2; // ok</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Помимо всего прочего, этот пример показывает, что\n";
echo "ис­пользуя явное приведение к типу можно сломать правила защиты. Ясно, делать\n";
echo "это не рекомендуется, и это приносит программис­ту заслуженную\n";
echo "&quot;награду&quot;. К несчастью , недисциплинированное использование явного\n";
echo "преобразования может создать адские ус­ловия для невинных жертв,\n";
echo "эксплуатирующих программу, в кото­рой это делается. Но, к счастью, нет способа\n";
echo "воспользоваться приведением для получения доступа к закрытому имени m1. Зак­рытый\n";
echo "член класса может использоваться только членами и друзьями этого класса.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968043\">7.2.5 Иерархия Типов</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Производный класс сам может быть базовым классом. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class secretary : employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class manager : employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class temporary : employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class consultant : temporary (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class director : manager (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class vice_president : manager (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class president\n";
echo ": vice_president (* ... </span>*); </p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Такое множество родственных классов принято\n";
echo "называть ие­рархией классов. Поскольку можно выводить класс только из од­ного\n";
echo "базового класса, такая иерархия является деревом и не может быть графом более\n";
echo "общей структуры. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class temporary (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee  ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class secretary\n";
echo ": employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// </span>не С<span lang=EN-US>++:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class temporary_secretary : temporary : secretary(* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class\n";
echo "consultant : temporary : employee (* ... </span>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>И этот факт вызывает сожаление, потому что\n";
echo "направленный ациклический граф производных классов был бы очень полезен. Такие\n";
echo "структуры описать нельзя, но можно смоделировать с по­мощью членов\n";
echo "соответствующих типов. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class temporary (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>class secretary\n";
echo ": employee (* ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// </span>Альтернатива<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class temporary_secretary : secretary</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(* temporary temp; ... *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class consultant : employee</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>(* temporary temp; ... *);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это выглядит неэлегантно и страдает как раз от тех\n";
echo "проб­лем, для преодоления которых были изобретены производные классы. Например,\n";
echo "поскольку consultant не является производ­ным от temporary, consultant'а нельзя\n";
echo "помещать с список вре­менных служащих (temporary employee), не написав\n";
echo "специальный код. Однако во многих полезных программах этот метод успешно\n";
echo "используется.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968044\">7.2.6 Конструкторы и Деструкторы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для некоторых производных классов нужны\n";
echo "конструкторы. Если у базового класса есть конструктор, он должен вызывать­ся, и\n";
echo "если для этого конструктора нужны параметры, их надо предоставить. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class base (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base(char* n, short t);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~base();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class derived : public base (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base m;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived(char* n);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>~derived();</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Параметры конструктора базового класса\n";
echo "специфицируются в определении конструктора производного класса. В этом смысле\n";
echo "базовый класс работает точно также, как неименованный член производного класса\n";
echo "(см. <span lang=EN-US>#5.5.4). </span>Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived::derived(char* n) : (n,10), m(&quot;member&quot;,123)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*) </p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Объекты класса конструируются снизу вверх: сначала\n";
echo "базо­вый, потом члены, а потом сам производный класс. Уничтожаются они в\n";
echo "обратном порядке: сначала сам производный класс, потом члены а потом базовый.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968045\">7.2.7 Поля Типа</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы использовать производные классы не просто как\n";
echo "удобную сокращенную запись в описаниях, надо разрешить следу­ющую проблему:\n";
echo "Если задан указатель типа base*, какому произ­водному типу в действительности\n";
echo "принадлежит указываемый объ­ект? Есть три основных способа решения этой\n";
echo "проблемы:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>[1]\n";
echo "Обеспечить,  чтобы всегда указывались только объекты</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:59.4pt;text-autospace:none'>одного типа (#7.3.3),</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>[2] Поместить\n";
echo "в базовый класс поле типа,  которое смогут</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:59.4pt;text-autospace:none'>просматривать функции и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>[3] Использовать виртуальные\n";
echo "функции (#7.2.8).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Обыкновенно указатели на базовые классы\n";
echo "используются при разработке контейнерных (или вмещающих) классов: множество,\n";
echo "вектор, список и т.п. В этом случае решение 1 дает однородные списки, то есть\n";
echo "списки объектов одного типа. Решения 2 и 3 можно использовать для построения\n";
echo "неоднородных списков, то есть списков объектов (указателей на объекты)\n";
echo "нескольких раз­личных типов. Решение 3 - это специальный вариант решения 2 с\n";
echo "гарантией типа.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Давайте сначала исследуем простое решение с помощью поля\n";
echo "типа, то есть решение 2. Пример со служащими и менеджерами можно было бы\n";
echo "переопределить так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>enum empl_type\n";
echo "(* M, E *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>empl_type type;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* name;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short department;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct manager : employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* group;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short level; // </span>уровень</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Имея это, мы можем теперь написать функцию, которая\n";
echo "пе­чатает информацию о каждом служащем:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_employee(employee* e)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>switch (e-&gt;type) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>case E:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; e-&gt;name &lt;&lt; &quot;\t&quot; &lt;&lt;\n";
echo "e-&gt;department &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>break;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>case M:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; e-&gt;name &lt;&lt; &quot;\t&quot; &lt;&lt;\n";
echo "e-&gt;department &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>manager* p = (manager*)e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>cout &lt;&lt; &quot; </span>уровень<span\n";
echo "lang=EN-US> &quot; &lt;&lt; p-&gt;level &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>break;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>и воспользоваться ею для того, чтобы напечатать\n";
echo "список служащих:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (; ll; ll=ll-&gt;next) print_employee(ll);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это прекрасно работает,особенно в небольшой\n";
echo "программе, написанной одним человеком, но имеет тот коренной недостаток, что\n";
echo "неконтролируемым компилятором образом зависит от того, как программист работает\n";
echo "с типами. В больших программах это обычно приводит к ошибкам двух видов. Первый\n";
echo "- это невыполне­ние проверки поля типа, второй - когда не все случаи case по­мещаются\n";
echo "в переключатель switch, как в предыдущем примере. Оба избежать достаточно легко\n";
echo ", когда программу сначала пишут на бумаге, но при модификации нетривиальной\n";
echo "программы, осо­бенно написанной другим человеком, очень трудно избежать как\n";
echo "того, так и другого. Часто от этих сложностей становится труднее уберечься\n";
echo "из-за того, что функции вроде print() часто бывают организованы так, чтобы\n";
echo "пользоваться общностью клас­сов, с которыми они работают. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_employee(employee* e)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; e-&gt;name &lt;&lt; &quot;\t&quot; &lt;&lt;\n";
echo "e-&gt;department &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (e-&gt;type == M) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>manager* p = (manager*)e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'>cout &lt;&lt; &quot; уровень &quot; &lt;&lt; p-&gt;level\n";
echo "&lt;&lt; &quot;\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Отыскание всех таких операторов if, скрытых внутри\n";
echo "боль­шой функции, которая работает с большим числом производных классов, может\n";
echo "оказаться сложной задачей, и даже когда все они найдены, бывает нелегко понять,\n";
echo "что же в них делается.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968046\">7.2.8 Виртуальные Функции</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Виртуальные функции преодолевают сложности решения\n";
echo "с по­мощью полей типа, позволяя программисту описывать в базовом классе\n";
echo "функции, которые можно переопределять в любом произ­водном классе. Компилятор и\n";
echo "загрузчик обеспечивают правильное соответствие между объектами и применяемыми к\n";
echo "ним функциями. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* name;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short department;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual void print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Ключевое слово virtual указывает, что могут быть\n";
echo "различ­ные варианты функции print() для разных производных классов, и что поиск\n";
echo "среди них подходящей для каждого вызова print() является задачей компилятора.\n";
echo "Тип функции описывается в базо­вом классе и не может переописываться в\n";
echo "производном классе. Виртуальная функция должна быть определена для класса, в ко­тором\n";
echo "она описана впервые. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void employee::print()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; e-&gt;name &lt;&lt; &quot;\t&quot; &lt;&lt;\n";
echo "e-&gt;department &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Виртуальная функция может, таким образом,\n";
echo "использоваться даже в том случае, когда нет производных классов от ее клас­са,\n";
echo "и в производном классе, в котором не нужен специальный вариант виртуальной\n";
echo "функции, ее задавать не обязательно. Просто при выводе класса соответствующая\n";
echo "функция задается в том случае, если она нужна. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct manager : employee (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee* group;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>short level;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void manager::print()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee::print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;\t</span>уровень<span lang=EN-US>&quot; &lt;&lt;\n";
echo "level &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Функция print_employee() теперь не нужна, поскольку\n";
echo "ее место заняли функции члены print(), и теперь со списком слу­жащих можно\n";
echo "работать так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f(employee* ll)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (; ll; ll=ll-&gt;next) ll-&gt;print();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Каждый служащий будет печататься в соответствии с\n";
echo "его типом. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>employee e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>e.name = &quot;</span>Дж<span lang=EN-US>.</span>Браун<span\n";
echo "lang=EN-US>&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>e.department = 1234;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>e.next = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>manager m;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>m.name = &quot;</span>Дж<span lang=EN-US>.</span>Смит<span\n";
echo "lang=EN-US>&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>e.department = 1234;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>m.level = 2;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>m.next = &amp;e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>f(&amp;m);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>выдаст</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:232.3pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-indent:-52.8pt;text-autospace:\n";
echo "none'>Дж.Смит 1234 уровень 2</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:232.3pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Дж.Браун 1234</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что это будет работать даже в том случае,\n";
echo "если f() была написана и откомпилирована еще до того, как произ­водный класс\n";
echo "manager был задуман! Очевидно, при реализации этого в каждом объекте класса\n";
echo "employee сохраняется некоторая информация о типе. Занимаемого для этого\n";
echo "пространства (в те­кущей реализации) как раз хватает для хранения указателя.\n";
echo "Это пространство занимается только в объектах классов с виртуаль­ными\n";
echo "функциями, а не во всех объектах классов и даже не во всех объектах производных\n";
echo "классов. Вы платите эту пошлину только за те классы, для которых описали\n";
echo "виртуальные функции.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Вызов функции с помощью операции разрешения области\n";
echo "ви­димости ::, как это делается в manager::print(), гарантирует, что механизм\n";
echo "виртуальных функций применяться не будет. Иначе manager::print() подвергалось\n";
echo "бы бесконечной рекурсии. Приме­нение уточненного имени имеет еще один эффект,\n";
echo "который может оказаться полезным: если описанная как virtual функция описа­на\n";
echo "еще и как inline (в чем ничего необычного нет), то там, где в вызове\n";
echo "применяется ::, может применяться inline-подста­новка. Это дает программисту\n";
echo "эффективный способ справляться с теми важными специальными случаями, когда одна\n";
echo "виртуальная функция вызывает другую для того же объекта. Поскольку тип объекта\n";
echo "был определен при вызове первой виртуальной функции, обычно его не надо снова\n";
echo "динамически определять другом вызове для того же объекта.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968047\">7.3 Альтернативные Интерфейсы</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>После того, как описаны средства языка, которые\n";
echo "относят­ся к производным классам, обсуждение снова может вернуться к стоящим\n";
echo "задачам. В классах, которые описываются в этом разде­ле, основополагающая идея\n";
echo "состоит в том, что они однажды на­писаны, а потом их используют программисты,\n";
echo "которые не могут изменить их определение. Физически классы состоят из одного\n";
echo "или более заголовочных файлов, определяющих интерфейс, и од­ного или более\n";
echo "файлов, определяющих реализацию. Заголовочные файлы будут помещены куда-то\n";
echo "туда, откуда пользователь может взять их копии с помощью директивы #include.\n";
echo "Файлы, определя­ющие реализацию, обычно компилируют и помещают в библиотеку.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968048\">7.3.1 Интерфейс</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Рассмотрим такое написание класса slist для\n";
echo "однократно связанного списка, с помощью которого можно создавать как од­нородные,\n";
echo "так и неоднородные списки объектов тех типов, кото­рые еще должны быть\n";
echo "определены. Сначала мы определим тип ent:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>typedef void*\n";
echo "ent;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Точная сущность типа ent несущественна, но нужно,\n";
echo "чтобы в нем мог храниться указатель. Тогда мы определим тип slink:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class slink (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend class slist;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend class slist_iterator;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ent e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink(ent a, slink* p) (* e=a; next=p;*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>В одном звене может храниться один ent, и с помощью него реализуется\n";
echo "класс slist:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class slist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friend class slist_iterator;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink* last; // last-&gt;next - </span>голова списка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>public:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>int\n";
echo "insert(ent a); // добавить в голову списка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>int\n";
echo "append(ent a); // добавить в хвост списка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>ent get(); //\n";
echo "вернуться и убрать голову списка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>void clear(); // убрать все\n";
echo "звенья</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist() (* last=0; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:39.6pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist(ent a) (* last=new slink(a,0); last-&gt;next=last; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:39.6pt;text-autospace:none'>~slist() (*\n";
echo "clear(); *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:13.3pt;\n";
echo "margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Хотя список очевидным образом реализуется как\n";
echo "связанный список, реализацию можно изменить так, чтобы использовался вектор из\n";
echo "ent'ов, не повлияв при этом на пользователей. То есть, применение slink'ов\n";
echo "никак не видно в описаниях открытых функций slist'ов, а видно только в закрытой\n";
echo "части и определе­ниях функций.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968049\">7.3.2 Реализация</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Реализующие slist функции в основном просты.\n";
echo "Единствен­ная настоящая сложность - что делать в случае ошибки, если, например,\n";
echo "пользователь попытается get() что-нибудь из пустого списка. Мы обсудим это в\n";
echo "#7.3.4. Здесь приводятся определения членов slist. Обратите внимание, как\n";
echo "хранение указателя на последний элемент кругового списка дает возможность\n";
echo "просто реализовать оба действия append() и insert():</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int slist::insert(ent a)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (last)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last-&gt;next = new slink(a,last-&gt;next);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last = new slink(a,0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last-&gt;next = last;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int slist::append(ent a)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (last)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last = last-&gt;next = new slink(a,last-&gt;next);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last = new slink(a,0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last-&gt;next = last;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ent slist::get()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (last == 0) slist_handler(&quot;get fromempty list&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-indent:178.2pt;text-autospace:\n";
echo "none'>// взять из пустого списка slink* f = last-&gt;next;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ent r f-&gt;e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (f == last)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>last-&gt;next = f-&gt;next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete f;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return f;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Обратите внимание, как вызывается slist_handler\n";
echo "(его описание можно найти в #7.3.4). Этот указатель на имя функции используется\n";
echo "точно так же, как если бы он был именем функции. Это является краткой формой\n";
echo "более явной записи вызова:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>(*slist_handler)(&quot;get\n";
echo "fromempty list&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>И slist::clear(), наконец, удаляет\n";
echo "из списка все элементы:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void slist::clear()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink* l = last;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (l == 0) return;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>do (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink* ll = l;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>l = l-&gt;next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>delete ll;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*) while (l!=last);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Класс slist не обеспечивает способа заглянуть в\n";
echo "список, но только средства для вставления и удаления элементов. Одна­ко оба\n";
echo "класса, и slist, и slink, описывают класс slist_iterator как друга, поэтому мы\n";
echo "можем описать подходящий итератор. Вот один, написанный в духе #6.8:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class slist_iterator (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slink* ce;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist* cs;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>slist_iterator(slist&amp;\n";
echo "s) (* cs = &amp;s; ce = cs-&gt;last; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>ent\n";
echo "operator()() (*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>// для\n";
echo "индикации конца итерации возвращает 0</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>// для всех\n";
echo "типов не идеален, хорош для указателей</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ent ret = ce ? (ce=ce-&gt;next)-&gt;e : 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (ce == cs-&gt;last) ce= 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>return ret;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968050\">7.3.3 Как Этим Пользоваться</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Фактически класс slist в написанном виде\n";
echo "бесполезен. В конечном счете, зачем можно использовать список указателей void*?\n";
echo "Штука в том, чтобы вывести класс из slist и получить список тех объектов,\n";
echo "которые представляют интерес в конкрет­ной программе. Представим компилятор\n";
echo "языка вроде С++. В нем широко будут использоваться списки имен; имя name - это\n";
echo "нечто вроде</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct name (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* string;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В список будут помещаться указатели на имена, а не\n";
echo "сами объекты имена. Это позволяет использовать небольшое информа­ционное поле e\n";
echo "slist'а, и дает возможность имени находиться одновременно более чем в одном\n";
echo "списке. Вот определение класса nlist, который очень просто выводится из класса\n";
echo "slist:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;slist.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;name.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct nlist : slist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void insert(name* a) (* slist::insert(a); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void append(name* a) (* slist::append(a); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name* get() (**)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist(name* a) : (a) (**)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Функции нового класса или наследуются от slist\n";
echo "непос­редственно, или ничего не делают кроме преобразования типа. Класс nlist -\n";
echo "это ничто иное, как альтернативный интерфейс класса slist. Так как на самом\n";
echo "деле тип ent есть void*, нет необходимости явно преобразовывать указатели\n";
echo "name*, которые используются в качестве фактических параметров (#2.3.4).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Списки имен можно использовать в классе, который предс­тавляет\n";
echo "определение класса:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct classdef (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist friends;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist constructors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist destructors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist members;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist operators;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nlist virtuals;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void add_name(name*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>classdef();</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>~classdef();</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>и имена могут добавляться к этим спискам\n";
echo "приблизительно так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void classdef::add_name(name* n)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (n-&gt;is_friend()) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (find(&amp;friends,n))</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>error(&quot;friend redeclared&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:118.8pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// friend </span>переописан</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else if (find(&amp;members,n))</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>error(&quot;friend redeclared as member&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:118.8pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// friend </span>переописан как<span lang=EN-US> member</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>friends.append(n);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (n-&gt;is_operator()) operators.append(n);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>где is_operator() и is_friend() являются функциями\n";
echo "чле­нами класса name. Функцию find() можно написать так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int find(nlist* ll, name* n)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist_iterator ff(*(slist*)ll);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ent p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while ( p=ff() ) if (p==n) return 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return 0;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Здесь применяется явное преобразование типа, чтобы\n";
echo "при­менить slist_iterator к nlist. Более хорошее решение, сделать итератор для\n";
echo "nlist'ов, приведено в #7.3.5. Печатать nlist мо­жет, например, такая функция:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_list(nlist* ll, char* list_name)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist_iterator count(*(slist*)ll);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int n = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while ( count() ) n++;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; list_name &lt;&lt; &quot;\n&quot; &lt;&lt; n &lt;&lt;\n";
echo "&quot;members\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist_iterator print(*(slist*)ll);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:26.4pt;text-autospace:\n";
echo "none'><span lang=EN-US>while ( p=(name*)print() ) cout &lt;&lt; p-&gt;string\n";
echo "&lt;&lt; &quot;\n&quot;; *)</span></p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968051\">7.3.4 Обработка Ошибок</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Есть четыре подхода к проблеме, что же делать,\n";
echo "когда во время выполнения универсальное средство вроде slist сталкива­ется с\n";
echo "ошибкой (в С++ нет никаких специальных средств языка для обработки ошибок):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:59.4pt;margin-bottom:.0001pt;text-indent:-26.4pt;text-autospace:\n";
echo "none'>[1] Возвращать недопустимое значение и позволить пользо­вателю его\n";
echo "проверять</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:59.4pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-26.4pt;text-autospace:none'>[2] Возвращать дополнительное значение состояния и\n";
echo "раз­решить пользователю проверять его</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>[3] Вызывать\n";
echo "функцию ошибок,  заданную как часть  класса</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:59.4pt;text-autospace:none'>slist или</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>[4] Вызывать \n";
echo "функцию  ошибок,  которую предположительно</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:59.4pt;text-autospace:none'>предоставляет пользователь.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для небольшой программы, написанной ее единственным\n";
echo "пользователем, нет фактически никаких особенных причин пред­почесть одно из\n";
echo "этих решений другим. Для средства общего наз­начения ситуация совершенно иная.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Первый подход, возвращать недопустимое значение, неосу­ществим.\n";
echo "Нет совершенно никакого способа узнать, что некоторое конкретное значение будет\n";
echo "недопустимым во всех при­менениях slist.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Второй подход, возвращать значение состояния, можно ис­пользовать\n";
echo "в некоторых классах (один из вариантов этого плана применяется в стандартных\n";
echo "потоках ввода/вывода istream и ostream; как - объясняется в #8.4.2). Здесь,\n";
echo "однако, имеется серьезная проблема, вдруг пользователь не позаботится прове­рить\n";
echo "значение состояния, если средство не слишком часто под­водит. Кроме того,\n";
echo "средство может использоваться в сотнях или даже тысячах мест программы.\n";
echo "Проверка значения в каждом месте сильно затруднит чтение программы.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Третьему подходу, предоставлять функцию ошибок, недоста­ет\n";
echo "гибкости. Тот, кто реализует универсальное средство, не может узнать, как\n";
echo "пользователи захотят, чтобы обрабатывались ошибки. Например, пользователь может\n";
echo "предпочитать сообщения на датском или венгерском.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Четвертый подход, позволить пользователю задавать функ­цию\n";
echo "ошибок, имеет некоторую привлекательность при условии, что разработчик\n";
echo "предоставляет класс в виде библиотеки (#4.5), в которой содержатся стандартные\n";
echo "функции обработки ошибок.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Решения 3 и 4 можно сделать более гибкими (и по сути эк­вивалентными),\n";
echo "задав указатель на функцию, а не саму функцию. Это позволит разработчику такого\n";
echo "средства, как slist, предос­тавить функцию ошибок, действующую по умолчанию, и\n";
echo "при этом программистам, которые будут использовать списки, будет легко задать\n";
echo "свои собственные функции ошибок, когда нужно, и там, где нужно. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>typedef void\n";
echo "(*PFC)(char*); // указатель на тип функция</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern PFC slist_handler;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern PFC\n";
echo "set_slist_handler(PFC);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Функция set_slist_hanlder() позволяет пользователю\n";
echo "заме­нить стандартную функцию. Общепринятая реализация предостав­ляет\n";
echo "действующую по умолчанию функцию обработки ошибок, кото­рая сначала пишет\n";
echo "сообщение об ошибке в cerr, после чего завершает программу с помощью exit():</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;slist.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void default_error(char* s)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cerr &lt;&lt; s &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>exit(1);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Она описывает также указатель на функцию ошибок и,\n";
echo "для удобства записи, функцию для ее установки:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>PFC\n";
echo "slist_handler = default_error;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PFC set_slist_handler(PFC handler);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:174.2pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PFC rr = slist_handler; slist_handler = handler; return rr;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:174.2pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Обратите внимание, как set_slist_hanlder()\n";
echo "возвращает предыдущий slist_hanlder(). Это делает удобным установку и\n";
echo "переустановку обработчиков ошибок на манер стека. В основном это может быть\n";
echo "полезным в больших программах, в которых slist может использоваться в\n";
echo "нескольких разных ситуациях, в каждой из которых могут, таким образом, задаваться\n";
echo "свои собственные подпрограммы обработки ошибок. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>PFC old =\n";
echo "set_slist_handler(my_handler);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// код, в\n";
echo "котором в случае ошибок в slist</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>// будет использоваться мой\n";
echo "обработчик my_handler</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>set_slist_handler(old); // </span>восстановление</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы сделать управление более изящным,\n";
echo "slist_hanlder мог бы быть сделан членом класса slist, что позволило бы раз­личным\n";
echo "спискам иметь одновременно разные обработчики.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968052\">7.3.5 Обобщенные Классы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Очевидно, можно было бы определить списки других\n";
echo "типов (classdef*, int, char* и т.д.) точно так же, как был опреде­лен класс\n";
echo "nlist: простым выводом из класса slist. Процесс оп­ределения таких новых типов\n";
echo "утомителен (и потому чреват ошиб­ками), но с помощью макросов его можно\n";
echo "&quot;механизировать&quot;. К сожалению, если пользоваться стандартным C\n";
echo "препроцессором (#4.7 и #с.11.1), это тоже может оказаться тягостным. Однако\n";
echo "полученными в результате макросами пользоваться довольно просто.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Вот пример того, как обобщенный (generic) класс slist,\n";
echo "названный gslist, может быть задан как макрос. Сначала для написания такого\n";
echo "рода макросов включаются некоторые инстру­менты из &lt;generic.h&gt;:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;slist.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#ifndef GENERICH</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;generic.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>#endif</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Обратите внимание на использование #ifndef для\n";
echo "того, чтобы гарантировать, что &lt;generic.h&gt; в одной компиляции не будет\n";
echo "включен дважды. GENERICH определен в &lt;generic.h&gt;.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>После этого с помощью name2(), макроса из\n";
echo "&lt;generic.h&gt; для конкатенации имен, определяются имена новых обобщенных\n";
echo "классов:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#define gslist(type) name2(type,gslist)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#define\n";
echo "gslist_iterator(type) name2(type,gslist_iterator)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>И, наконец,                можно  \n";
echo "написать  классы  gslist(тип)   и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'><span lang=EN-US>gslist_iterator(</span>тип<span\n";
echo "lang=EN-US>):</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#define gslistdeclare(type)                                                                                                  \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct gslist(type) : slist (*                                                                                                     \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int insert(type a)                                                                                                       \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(* return slist::insert( ent(a) ); *)                                                          \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int append(type a)                                                                                                    \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(* return slist::append( ent(a) ); *)                                                       \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>type get() (* return type( slist::get() ); *)                                                                 \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>gslist(type)() (* *)                                                                                                    \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>gslist(type)(type a) : (ent(a)) (* *)                                                                          \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>~gslist(type)() (* clear(); *)                                                                                 \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*);                                                                                                                                       \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:376.2pt;text-autospace:\n";
echo "none'><span lang=EN-US>\ struct gslist_iterator(type) : slist_iterator\n";
echo "(*        \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>gslist_iterator(type)(gslist(type)&amp; a)                                                                          \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>: ( (slist&amp;)s ) (**)                                                                                  \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>type operator()()                                                                                                      \</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:52.8pt;text-autospace:\n";
echo "none'><span lang=EN-US>(* return type( slist_iterator::operator()() ); *)\ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>\ на конце строк указывает , что следующая строка явля­ется\n";
echo "частью определяемого макроса.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>С помощью этого макроса список указателей на имя, анало­гичный\n";
echo "использованному раньше классу nlist, можно определить так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;name.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>typedef name* Pname;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>declare(gslist,Pname);\n";
echo "// </span>описывает класс<span lang=EN-US> gslist(Pname)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>gslist(Pname)\n";
echo "nl; // </span>описывает один<span lang=EN-US> gslist(Pname)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Макрос declare (описать) определен в\n";
echo "&lt;generic.h&gt;. Он конкатинирует свои параметры и вызывает макрос с этим\n";
echo "именем, в данном случае gslistdeclare, описанный выше. Параметр имя типа для\n";
echo "declare должен быть простым именем. Используемый ме­тод макроопределения не\n";
echo "может обрабатывать имена типов вроде name*, поэтому применяется typedef.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Использование вывода класса гарантирует, что все частные\n";
echo "случаи обобщенного класса разделяют код. Этот метод можно применять только для\n";
echo "создания классов объектов того же разме­ра или меньше, чем базовый класс,\n";
echo "который используется в мак­росе. gslist применяется в #7.6.2.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968053\">7.3.6 Ограниченные Интерфейсы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Класс slist - довольно общего характера. Иногда\n";
echo "подобная общность не требуется или даже нежелательна. Ограниченные ви­ды\n";
echo "списков, такие как стеки и очереди, даже более обычны, чем сам обобщенный\n";
echo "список. Такие структуры данных можно задать, не описав базовый класс как\n";
echo "открытый. Например, очередь целых можно определить так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;slist.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class iqueue : slist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:99.0pt;text-autospace:\n";
echo "none'><span lang=EN-US>//</span>предполагается<span lang=EN-US>\n";
echo "sizeof(int)&lt;=sizeof(void*) public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void put(int a) (* slist::append((void*)a); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int det() (* return int(slist::get()); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>iqueue() (**)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>При таком выводе осуществляются два логически\n";
echo "разделен­ных действия: понятие списка ограничивается понятием очереди (сводится\n";
echo "к нему), и задается тип int, чтобы свести понятие очереди к типу данных очередь\n";
echo "целых, iqueue. Эти два действия можно выполнять и раздельно. Здесь первая часть\n";
echo "- это список, ограниченный так, что он может использоваться только как стек:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;slist.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class stack : slist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist::insert;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>slist::get;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>stack() (**)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>stack(ent a) : (a) (**)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>который потом используется для создания типа\n";
echo "&quot;стек ука­зателей на символы&quot;:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;stack.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class cp : stack (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void push(char* a) (* slist::insert(a); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* pop() (* return (char*)slist::get(); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>nlist() (**)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968054\">7.4 Добавление к Классу</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В предыдущих примерах производный класс ничего не\n";
echo "добав­лял к базовому классу. Для производного класса функции опре­делялись\n";
echo "только чтобы обеспечить преобразование типа. Каждый производный класс просто\n";
echo "задавал альтернативный интерфейс к общему множеству программ. Этот специальный\n";
echo "случай важен, но наиболее обычная причина определения новых классов как произ­водных\n";
echo "классов в том, что кто-то хочет иметь то, что предос­тавляет базовый класс,\n";
echo "плюс еще чуть-чуть.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Для производного класса можно определить данные и функ­ции\n";
echo "дополнительно к тем, которые наследуются из его базового класса. Это дает\n";
echo "альтернативную стратегию того, как обеспе­чить средства связанного списка.\n";
echo "Заметьте, когда в тот slist, который определялся выше, помещается элемент, то\n";
echo "создается slink, содержащий два указателя. На их создание тратится вре­мя, а\n";
echo "ведь без одного из указателей можно обойтись, при усло­вии, что нужно только\n";
echo "чтобы объект мог находиться в одном списке. Так что указатель next на следующий\n";
echo "можно поместить в сам объект, вместо того, чтобы помещать его в отдельный объ­ект\n";
echo "slink. Идея состоит в том, чтобы создать класс olink с единственным полем next,\n";
echo "и класс olist, который может обраба­тывать указатели на такие звенья olink.\n";
echo "Тогда olist сможет манипулировать объектами любого класса, производного от\n";
echo "olink. Буква &quot;o&quot; в названиях стоит для того, чтобы напоминать вам,\n";
echo "что объект может находиться одновременно только в одном списке olist:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct olink (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>olink* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Класс olist очень напоминает класс slist. Отличие состо­ит в том, что\n";
echo "пользователь класса olist манипулирует объекта­ми класса olink непосредственно:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class olist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>olink* last;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void insert(olink* p);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void append(olink* p);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>olink* get();</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Мы можем вывести из класса olink\n";
echo "класс name:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class name : public olink (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Теперь легко сделать список, который можно\n";
echo "использовать без накладных расходов времени на размещение или памяти.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Объекты, помещаемые в olist, теряют свой тип. Это озна­чает,\n";
echo "что компилятор знает только то, что они olink'и. Пра­вильный тип можно\n";
echo "восстановить с помощью явного преобразова­ния типа объектов, вынутых из olist.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void f()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>olist ll;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name nn;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ll.insert(&amp;nn); // </span>тип<span lang=EN-US> &amp;nn </span>потерян</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>name* pn =\n";
echo "(name*)ll.get(); // и восстановлен</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Другой способ: тип можно восстановить, выводя еще\n";
echo "один класс из olist для обработки преобразования типа:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class onlist : public olist (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name* get() (* return (name*)olist::get(); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Имя name может одновременно находиться только в\n";
echo "одном olist. Для имен это, может быть, и не подходит, но в классах, для которых\n";
echo "это подойдет полностью, недостатка нет. Например, класс фигур shape использует\n";
echo "для поддержки списка всех фигур именно этот метод. Обратите внимание, что можно\n";
echo "было бы опре­делить slist как производный от olist, объединяя таким обра­зом\n";
echo "оба понятия. Однако использование базовых и производных классов на таком\n";
echo "микроскопическом уровне может очень сильно исказить код.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968055\">7.5 Неоднородные Списки</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Предыдущие списки были однородными. То есть, в\n";
echo "список помещались только объекты одного типа. Это обеспечивалось ап­паратом\n";
echo "производных классов. Списки не обязательно должны быть однородными. Список,\n";
echo "заданный в виде указателей на класс, может содержать объекты любого класса,\n";
echo "производного от этого класса. То есть, список может быть неоднородным. Веро­ятно,\n";
echo "это единственный наиболее важный и полезный аспект про­изводных классов, и он\n";
echo "весьма существенно используется в сти­ле программирования, который\n";
echo "демонстрируется приведенным выше примером. Этот стиль программирования часто\n";
echo "называют объектно -основанным или объектно-ориентированным. Он опирается на то,\n";
echo "что действия над объектами неоднородных списков выполняются одинаковым образом.\n";
echo "Смысл этих действий зависит от фактичес­кого типа объектов, находящихся в\n";
echo "списке (что становится из­вестно только на стадии выполнения), а не просто от\n";
echo "типа эле­ментов списка (который компилятору известен).</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968056\">7.6 Законченная Программа</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Разберем процесс написания программы для рисования\n";
echo "на экране геометрических фигур. Она естественным образом разде­ляется на три\n";
echo "части:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>[1] \n";
echo "Администратор экрана:   подпрограммы  низкого уровня и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'>структуры\n";
echo "данных,  определяющие экран;он ведает только</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:46.2pt;text-autospace:none'>точками и прямыми линиями,</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>[2] \n";
echo "Библиотека фигур:   набор  определений  основных фигур</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'>вроде\n";
echo "прямоугольника и круга и  стандартные  программы</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:46.2pt;text-autospace:none'>для работы с ними и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-33.0pt;text-autospace:none'>[3] Прикладная программа: множество определений,\n";
echo "специали­зированных для данного приложения, и код, который их использует.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Эти три части скорее всего будут писать разные люди (в\n";
echo "разных организациях и в разное время). При этом части будут скорее всего писать\n";
echo "именно в указанном порядке с тем осложня­ющим обстоятельством, что у\n";
echo "разработчиков нижнего уровня не будет точного представления, для чего их код в\n";
echo "конечном счете будет использоваться. Это отражено в приводимом примере. Что­бы\n";
echo "пример был короче, графическая библиотека предоставляет только весьма\n";
echo "ограниченный сервис, а сама прикладная програм­ма очень проста. Чтобы читатель\n";
echo "смог испытать программу, даже если у него нет совсем никаких графических\n";
echo "средств, использу­ется чрезвычайно простая концепция экрана. Не должно соста­вить\n";
echo "труда заменить эту экранную часть программы чем-нибудь подходящим, не изменяя\n";
echo "код библиотеки фигур и прикладной программы.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968057\">7.6.1 Администратор Экрана</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Вначале было намерение написать администратор\n";
echo "экрана на C (а не на С++), чтобы подчеркнуть разделение уровней реали­зации.\n";
echo "Это оказалось слишком утомительным, поэтому пришлось пойти на компромисс:\n";
echo "используется стиль C (нет функций чле­нов, виртуальных функций, определяемых\n";
echo "пользователем операций и т.п.), однако применяются конструкторы, надлежащим\n";
echo "образом описываются и проверяются параметры функций и т.д. Оглядыва­ясь назад,\n";
echo "можно сказать, что администратор экрана очень по­хож на C программу, которую\n";
echo "потом модифицировали, чтобы вос­пользоваться средствами С++ не переписывая все\n";
echo "полностью.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Экран представляется как двумерный массив символов, работу\n";
echo "с которым осуществляют функции put_point() и put_line(), использующие при\n";
echo "обращении с экраном структуру point:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>// </span>файл<span\n";
echo "lang=EN-US> screen.h</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>const XMAX=40,\n";
echo "YMAX=24;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct point (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int x,y;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point() (**)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point(int a, int b) (* x=a; y=b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*); </span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload put_point;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern void put_point(int a, int b);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>inline void\n";
echo "put_point(point p) (* put_point(p.x,p.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload put_line;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern void put_line(int, int, int, int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>inline void put_line(point a, point b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>(*\n";
echo "put_line(a.x,a.y,b.x,b.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern void screen_init();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern void screen_refresh();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern void\n";
echo "screen_clear();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Перед первым использованием функции put экран надо\n";
echo "ини­циализировать с помощью screen_init(), а изменения в структу­ре данных\n";
echo "экрана отображаются на экране только после вызова screen_refresh(). Как увидит\n";
echo "пользователь, это &quot;обновление&quot; (&quot;refresh&quot;) осуществляется\n";
echo "просто посредством печати новой копии экрана под его предыдущим вариантом. Вот\n";
echo "функции и оп­ределения данных для экрана:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;screen.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>enum color (*\n";
echo "black='*', white=' ' *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>char\n";
echo "screen[XMAX][YNAX];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void screen_init()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int y=0; y&lt;YMAX; y++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int x=0; x&lt;XMAX; x++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>screen[x][y] = white;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Точки печатаются, только если\n";
echo "они есть на экране:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>inline int on_screen(int a, int b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return 0&lt;=a &amp;&amp; a&lt;XMAX &amp;&amp; 0&lt;=b &amp;&amp;\n";
echo "b&lt;YMAX;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void put_point(int a, int b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (on_screen(a,b)) screen[a][b] = black;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Для рисования линий используется\n";
echo "функция put_line():</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void put_line(int x0, int y0, int x1, int y1)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>/*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>Строит линию\n";
echo "от (x0,y0) до (x1,y1).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>Строится\n";
echo "линия b(x-x0) + a(y-y0) = 0.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>Минимизирует\n";
echo "abs(eps), где eps = 2*(b(x-x0)+ a(y-y0)).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>См<span\n";
echo "lang=EN-US>. Newman and Sproull:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>``Principles of Interactive Computer Graphics''</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>McGraw-Hill, New York, 1979, pp 33-44.</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*/</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>register dx = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a = x1 - x0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (a &lt; 0) dx = -1, a = -a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>register dy = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int b = y1 - y0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (b &lt; 0) dy = -1, b = -b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int two_a = 2*a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int two_b = 2*b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int xcrit = -b + two_a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>register eps = 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (;;) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_point(x0,y0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if(x0==x1 &amp;&amp; y0==y1) break;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>if(eps &lt;= xcrit) x0 += dx, eps +=\n";
echo "two_b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>if(eps&gt;=a !! a&lt;=b) y0 += dy, eps -=\n";
echo "two_a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Предоставляются функции для очистки экрана и его\n";
echo "обнов­ления:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>void\n";
echo "screen_clear() (* screen_init(); *) // </span>очистка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void screen_refresh() // </span>обновление</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int y=YMAX-1; 0&lt;=y; y--) (* // </span>сверху вниз</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>for (int x=0;\n";
echo "x&lt;XMAX; x++) // слева направо</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout.put(screen[x][y]);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout.put('\n');</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Функция ostream::put() применяется для печати\n";
echo "символов как символов; ostream::operator&lt;&lt;() печатает символы как ма­лые\n";
echo "целые. Пока что вы может представлять себе, что эти опре­деления доступны\n";
echo "только в откомпилированном виде, который вы изменить не можете.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968058\">7.6.2 Библиотека Фигур</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Нам нужно определить общее понятие фигуры (shape).\n";
echo "Это надо сделать таким образом, чтобы оно использовалось (как ба­зовый класс)\n";
echo "всеми конкретными фигурами (например, кругами и квадратами), и так, чтобы любой\n";
echo "фигурой можно было манипули­ровать исключительно через интерфейс,\n";
echo "предоставляемый классом shape:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct shape (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:26.4pt;text-autospace:none'><span lang=EN-US>shape() (*\n";
echo "shape_list.append(this); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>virtual point north() (*return\n";
echo "point(0,0);*) // </span>север</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual point south() (*return point(0,0);*) // </span>юг</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual point east()  (*return point(0,0);*) // </span>восток</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:26.4pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual point neast() (*return point(0,0);*)//</span>северо<span\n";
echo "lang=EN-US>-</span>восток</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:13.3pt;\n";
echo "margin-left:26.4pt;text-autospace:none'><span lang=EN-US>virtual point seast()\n";
echo "(*return point(0,0);*) // </span>юго<span lang=EN-US>-</span>восток</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:26.4pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual void draw() (**); // </span>нарисовать</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-left:26.4pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual void move(int, int) (**); // </span>переместить</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:13.3pt;\n";
echo "margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Идея состоит в том, что расположение фигуры\n";
echo "задается с помощью move(), и фигура помещается на экран с помощью draw().\n";
echo "Фигуры можно располагать относительно друг друга, ис­пользуя понятие точки\n";
echo "соприкосновения, и эти точки перечисля­ются после точек компаса (сторон света).\n";
echo "Каждая конкретная фигура определяет свой смысл этих точек, и каждая определяет\n";
echo "способ, которым она рисуется. Для экономии места здесь на са­мом деле\n";
echo "определяются только необходимые в этом примере сто­роны света. Конструктор\n";
echo "shape::shape() добавляет фигуру в список фигур shape_list. Этот список является\n";
echo "gslist, то есть, одним из вариантов обобщенного односвязанного списка,\n";
echo "определенного в #7.3.5. Он и соответствующий итератор были </p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>сделаны так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>typedef\n";
echo "shape* sp;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>declare(gslist,sp);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>typedef gslist(sp) shape_lst;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>typedef\n";
echo "gslist_iterator(sp) sp_iterator;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>поэтому shape_list можно описать\n";
echo "так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>shape_lst\n";
echo "shape_list;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Линию можно построить либо по двум точкам, либо по точке и целому.  В\n";
echo "последнем случае создается горизонтальная линия, длину которой определяет\n";
echo "целое.  Знак целого указывает, каким концом является точка: левым или правым.\n";
echo "Вот определение<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class line : public shape (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>/*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>линия из 'w'\n";
echo "в 'e'</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>north()\n";
echo "определяется как ``выше центра</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>и на север\n";
echo "как до самой северной точки''</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*/</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point w,e;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point north()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:66.0pt;text-autospace:none'><span lang=EN-US>(* return\n";
echo "point((w.x+e.x)/2,e.y&lt;w.y?w.y:e.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point south()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:66.0pt;text-autospace:none'><span lang=EN-US>(* return\n";
echo "point((w.x+e.x)/2,e.y&lt;w.y?e.y:w.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void move(int a, int b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(* w.x += a; w.y += b; e.x += a; e.x += b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>void draw() (*\n";
echo "put_line(w,e); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>line(point a, point b) (* w = a; e = b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>line(point a, int l)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(* w = point(a.x+l-1,a.y); e = a; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:33.0pt;text-autospace:none'>Аналогично определяется\n";
echo "прямоугольник rectangle:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class rectangle : public shape (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>/*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>nw ---- n ---- ne</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>! !</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>! !</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>w c e</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>! !</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>! !</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sw ---- s ---- se</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*/</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point sw,ne;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point north() (* return point((sw.x+ne.x)/2,ne.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point south() (* return point((sw.x+ne.x)/2,sw.y); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point neast() (* return ne; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point swest() (* return sw; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void move (int a, int b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>(* sw.x+=a; sw.y+=b; ne.x+=a; ne.y+=b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void draw();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>rectangle(point, point);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Прямоугольник строится по двум точкам. Код\n";
echo "усложняется из-за необходимости выяснять относительное положение этих то­чек:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>rectangle::rectangle(point a, point b);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (a.x &lt;= b.x) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:72.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sw = a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ne = b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sw = point(a.x,b.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ne = point(b.x,a.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (a.y &lt;= b.y) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sw = point(b.x,a.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>ne = point(a.x,b.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>else (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sw = b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'>ne = a;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы построить прямоугольник, строятся четыре его\n";
echo "сто­роны:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void rectangle::draw();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point nw(sw.x,ne.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point se(ne.x,sw.y);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_line(nw,ne);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_line(ne,se);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_line(se,sw);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_line(sw,nw);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Помимо определений фигур в библиотеке фигур\n";
echo "содержатся функции для работы с ними. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void\n";
echo "shape_refresh(); // рисует все фигуры</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>void\n";
echo "stack(shape* p, shape* q); // </span>ставит<span lang=EN-US> p </span>на верх<span\n";
echo "lang=EN-US> q</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы справиться с нашим наивным экраном, нужна\n";
echo "обновля­ющая функция. Она просто рисует все фигуры заново. Обратите внимание,\n";
echo "что она совершенно не представляет, какие фигуры рисует:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void shape_refresh()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>screen_clear();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>sl_iterator next(shape_list);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape* p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>while ( p=next() ) p-&gt;draw();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>screen_refresh();</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>И вот, наконец, настоящая сервисная функция\n";
echo "(утилита). Она кладет одну фигуру на верх другой, задавая, что south() одной\n";
echo "должен быть сразу над north() другой:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void stack(shape* q, shape* p) // </span>ставит<span lang=EN-US> p </span>на\n";
echo "верх<span lang=EN-US> q</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point n = p-&gt;north();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point s = q-&gt;south();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>q-&gt;move(n.x-s.x,n.y-s.y+1);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Теперь представим себе, что эта библиотека\n";
echo "считается собственностью некой компании, которая продает программное\n";
echo "обеспечение, и что они продают вам только заголовочный файл, содержащий\n";
echo "определения фигур, и откомпилированный вариант оп­ределений функций. И у вас\n";
echo "все равно остается возможность оп­ределять новые фигуры и использовать для\n";
echo "ваших собственных фигур сервисные функции.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219968059\">7.6.3 Прикладная Программа</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Прикладная программа чрезвычайно проста.\n";
echo "Определяется новая фигура myshape (на печати она немного похожа на рожи­цу), а\n";
echo "потом пишется главная программа, которая надевает на нее шляпу. Вначале\n";
echo "описание myshape:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;shape.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class myshape : public rectangle (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>line* l_eye; // </span>левый глаз</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>line* r_eye; // </span>правый глаз</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>line* mouth; // </span>рот</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>myshape(point, point);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void draw();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void move(int, int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Глаза и рот - отдельные и независимые объекты,\n";
echo "которые создает конструктор myshape:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>myshape::myshape(point a, point b) : (a,b)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int ll = neast().x-swest().x+1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int hh = neast().y-swest().y+1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>l_eye = new line(</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>point(swest().x+2,swest().y+hh*3/4),2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>r_eye = new line(</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>point(swest().x+ll-4,swest().y+hh*3/4),2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>mouth = new line(</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-right:10.55pt;text-align:center;\n";
echo "text-autospace:none'><span lang=EN-US>point(swest().x+2,swest().y+hh/4),ll-4);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Объекты глаза и рот порознь рисуются заново\n";
echo "функцией shape_refresh(), и в принципе могут обрабатываться независимо из\n";
echo "объекта myshape, которому они принадлежат. Это один способ определять средства\n";
echo "для иерархически построенных объектов вроде myshape. Другой способ\n";
echo "демонстрируется на примере носа. Никакой нос не определяется, его просто\n";
echo "добавляет к картинке функция draw():</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void myshape::draw()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>rectangle::draw();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>put_point(point(</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:52.8pt;text-autospace:\n";
echo "none'><span lang=EN-US>(swest().x+neast().x)/2,(swest().y+neast().y)/2)); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>myshape передвигается посредством перемещения базового\n";
echo "прямоугольника rectangle и вторичных объектов l_eye, r_eye и mouth (левого\n";
echo "глаза, правого глаза и рта):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void myshape::move()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>rectangle::move();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>l_eye-&gt;move(a,b);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>r_eye-&gt;move(a,b);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>mouth-&gt;move(a,b);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Мы можем, наконец, построить несколько фигур и\n";
echo "немного их подвигать:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape* p1 = new rectangle(point(0,0),point(10,10));</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape* p2 = new line(point(0,15),17);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape* p3 = new myshape(point(15,10),point(27,18));</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape_refresh();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>p3-&gt;move(-10,-10);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>stack(p2,p3);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>stack(p1,p2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>shape_refresh();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return 0;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>Еще раз  \n";
echo "обратите   внимание,                             как   функции                  вроде</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>shape_refresh() и stack()\n";
echo "манипулируют объектами типов, опре­деляемых гораздо позже, чем были написаны\n";
echo "(и, может быть, от­компилированы) сами эти функции.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>***********</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-autospace:none'>* *</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "6.65pt;margin-left:33.0pt;text-autospace:none'><u>* * </u></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "6.65pt;margin-left:13.2pt;text-autospace:none'><u><span style='text-decoration:\n";
echo " none'>&nbsp;</span></u></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "6.65pt;margin-left:26.4pt;text-autospace:none'><u>* * </u></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "6.65pt;margin-left:26.4pt;text-autospace:none'><u>* * </u></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "6.65pt;margin-left:26.4pt;text-autospace:none'><u>* * </u></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:26.4pt;text-autospace:none'><u>* * </u></p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968060\">7.7 Свободная Память</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Если вы пользовались классом slist, вы могли\n";
echo "обнаружить, что ваша программа тратит на заметное время на размещение и\n";
echo "освобождение объектов класса slink. Класс slink - это превос­ходный пример\n";
echo "класса, который может значительно выиграть от того, что программист возьмет под\n";
echo "контроль управление свобод­ной памятью. Для этого вида объектов идеально\n";
echo "подходит опти­мизирующий метод, который описан в #5.5.6. Поскольку каждый slink\n";
echo "создается с помощью new и уничтожается с помощью delete членами класса slist,\n";
echo "другой способ выделения памяти не представляет никаких проблем.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Если производный класс осуществляет присваивание указа­телю\n";
echo "this, то конструктор его базового класса будет вызывать­ся только после этого\n";
echo "присваивания, и значение указателя this в конструкторе базового класса будет\n";
echo "тем, которое присвоено конструктором производного класса. Если базовый класс\n";
echo "присва­ивает указателю this, то будет присвоено то значение, которое использует\n";
echo "конструктор производного класса. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>struct base (*\n";
echo "base(); *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>struct derived\n";
echo ": base (* derived(); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base::base()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;\tbase 1: this=&quot; &lt;&lt; int(this)\n";
echo "&lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (this == 0) this = (base*)27;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;\tbase 2: this=&quot; &lt;&lt; int(this)\n";
echo "&lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived::derived()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;\tderived 1: this=&quot; &lt;&lt; int(this)\n";
echo "&lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>this = (this == 0) ? (derived*)43 : this;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;\tderived 2: this=&quot; &lt;&lt; int(this)\n";
echo "&lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>main()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;base b;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;new base b;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>new base;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;derived d;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived d;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot;new derived d;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>new derived;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>cout &lt;&lt;\n";
echo "&quot;at the end\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>порождает вывод</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>base b;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 1: this=2147478307</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 2: this=2147478307</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>new base;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 1: this=0</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 2: this=27</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived d;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived 1: this=2147478306</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 1: this=2147478306</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 2: this=2147478306</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived 1: this=2147478306</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>new derived;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived 1: this=0</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 1: this=43</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>base 2: this=43</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>derived 1: this=43</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>at the end</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>Если деструктор производного класса осуществляет присва­ивание указателю\n";
echo "this, то будет присвоено то значение, кото­рое встретил деструктор его базового\n";
echo "класса. Когда кто-либо делает в конструкторе присваивание указателю this,\n";
echo "важно, чтобы присваивание указателю this встречалось на всех путях в\n";
echo "конструкторе*.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>--------------------</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>* К сожалению, об этом присваивании легко забыть. Напри­мер, в первом\n";
echo "издании этой книги (английском - перев.) вторая строка конструктор\n";
echo "derived::derived() читалась так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>if (this == 0)\n";
echo "this = (derived*)43;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>И следовательно, для d конструктор базового класса\n";
echo "base::base() не вызывался. Программа была допустимой и кор­ректно выполнялась,\n";
echo "но, очевидно, делала не то, что подразу­мевал автор. (прим. автора)</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219968061\">7.8 Упражнения</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>1. (*1) Определите</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>class base (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:46.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>public:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:72.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>virtual void iam() (* cout &lt;&lt; &quot;base\n&quot;; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:46.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-autospace:\n";
echo "none'>Выведите из base два класса и для каждого определите iam () (&quot;я\n";
echo "есть&quot;), которая выводит имя класса на печать. Создайте объекты этих\n";
echo "классов и вызовите для них iam(). Присвойте адреса объектов производных классов\n";
echo "указателям base* и вызовите iam() через эти указатели.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-indent:-19.8pt;text-autospace:\n";
echo "none'>2. (*2) Реализуйте примитивы экрана (#7.6.1) подходящим для вашей системы\n";
echo "образом.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>3. (*2) Определите класс triangle (треугольник) и\n";
echo "класс circle (круг).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-indent:-19.8pt;text-autospace:\n";
echo "none'>4. (*2) Определите функцию, которая рисует линию, соединяю­щую две\n";
echo "фигуры, отыскивая две ближайшие &quot;точки соприкос­новения&quot; и соединяя\n";
echo "их.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-indent:-19.8pt;text-autospace:\n";
echo "none'>5. (*2) Модифицируйте пример с фигурами так, чтобы line бы­ла rectangle и\n";
echo "наоборот.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>6. (*2) Придумайте и реализуйте дважды связанный\n";
echo "список, который можно использовать без итератора.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>7. (*2) Придумайте и реализуйте дважды связанный\n";
echo "список, которым можно пользоваться только посредством итератора. Итератор\n";
echo "должен иметь действия для движения вперед и на­зад, действия для вставления и\n";
echo "удаления элементов спис­ка, и способ доступа к текущему элементу.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>8. (*2) Постройте обобщенный вариант дважды\n";
echo "связанного списка.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>9. (*4) Сделайте список, в котором вставляются и\n";
echo "удаляются сами объекты (а не просто указатели на объекты). Проде­лайте это для\n";
echo "класса X, для которого определены X::X(X&amp;), X::~X() X::operator=(X&amp;).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:33.0pt;margin-bottom:.0001pt;text-align:justify;text-indent:\n";
echo "-19.8pt;text-autospace:none'>10.(*5) Придумайте и реализуйте библиотеку для\n";
echo "написания моделей, управляемых прерываниями. Подсказка: &lt;task.h&gt;. Только\n";
echo "это - старая программа, а вы могли бы написать лучше. Должен быть класс task -\n";
echo "задача. Объект класса task должен мочь сохранять свое состояние и восстанавли­ваться\n";
echo "в это состояние (вы можете определить task::save() и task::restore()), чтобы он\n";
echo "мог действо­вать как сопрограмма. Отдельные задачи можно определять как объекты\n";
echo "классов, производных от класса task. Прог­рамма, которую должна исполнять\n";
echo "задача, может задаваться как виртуальная функция. Должна быть возможность\n";
echo "переда­вать новой задаче ее параметры как параметры ее конс­труктора(ов). Там\n";
echo "должен быть планировщик, реализующий концепцию виртуального времени. Обеспечьте\n";
echo "функцию за­держки task::delay(), которая &quot;тратит&quot; виртуальное вре­мя.\n";
echo "Будет ли планировщик отдельным или частью класса task - это один из основных\n";
echo "вопросов, которые надо ре­шить при проектировании. Задача должна передавать дан­ные.\n";
echo "Для этого разработайте класс queue (очередь). При­думайте способ, чтобы задача\n";
echo "ожидала ввода из нескольких очередей. Ошибки в ходе выполнения обрабатывайте\n";
echo "одно­родным образом. Как бы вы отлаживали программы, написан­ные с помощью\n";
echo "такой библиотеки?</p>\n";
echo "\n";
?>
