You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
virtual void write(char *pString);<br />
class ThreedVGA : public HWVGA<br />
virtual void initialized;<br />
};<br />
void fn()<br />
SVGA me;<br />
VGA vga;<br />
//все остальное<br />
S<br />
Класс Display, описывающий дисплеи персонального компьютера, содержит две<br />
чисто виртуальные функции: initialize () и writef]. Вы не можете ввести эти<br />
функции в общем виде. <strong>Р</strong>азные типы видеоадаптеров инициализируются и осуществляют<br />
вывод по-разному.<br />
Один из подклассов — SVGA — не абстрактный. Это отдельный тип видеоадаптера,<br />
и программист точно знает, как его реализовать. Таким образом, класс SVGA переопределяет<br />
обе функции— initialized и writef) — именно так, как необходимо<br />
для данного адаптера.<br />
Еще один подкласс — HWVGA . Программисту известно, как программировать ускоренный<br />
VGA-адаптер. Поэтому между общим классом Display и его частным случаем,<br />
ThreedVGA, который представляет собой специальный тип карт 3-D, находится<br />
еще один уровень абстракции.<br />
В нашем обсуждении предположим, что запись во все аппаратно ускоренные карты<br />
VGA происходит одинаково (это не соответствует истине, но представим себе, что<br />
это так). Чтобы правильно выразить общее свойство записи, вводится класс HWVGA,<br />
реализующий функцию write () (и другие общие для HWVGA свойства). При этом<br />
функция initialize () не переопределяется, поскольку для разных типов карт<br />
HWVGA она реализуется по-разному.<br />
Поэтому, несмотря на то что функция write () переопределена в классе HWVGA, ОН<br />
все равно остается абстрактным, поскольку функция initialize () все еще не переопределена.<br />
Поскольку ThreedVGA наследуется от HWVGA, он должен переопределить только<br />
одну функцию, initialize {), для того чтобы окончательно определить адаптер дисплея.<br />
Таким образом, функция f n () может свободно реализовать и использовать объект<br />
класса ThreedVGA.<br />
Замещение нормальной функцией последней чисто виртуальной функции<br />
делает класс завершенным (т.е. неабстрактным). Только неабстрактные<br />
классы могут быть реализованы в виде объектов.<br />
Изначально требовалось, чтобы каждая чисто виртуальная функция была<br />
переопределена в каждом подклассе другой, хотя бы и снова чисто виртуальной<br />
функцией. В конечном счете люди решили, что это глупое требование,<br />
и исключили его. Однако старые компиляторы могут требовать выполнения<br />
этого условия.<br />
250 Часть IV. Наследование