05.09.2016 Views

Стефан Р. - С++ Для чайников

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. Наследование

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!