Язык программирования C++ для профессионалов


Виртуальные базовые классы


В предыдущих разделах множественное наследование рассматривалось как существенный фактор, позволяющий за счет слияния классов безболезненно интегрировать независимо создававшиеся программы. Это самое основное применение множественного наследования, и, к счастью (но не случайно), это самый простой и надежный способ его применения.

Иногда применение множественного наследования предполагает достаточно тесную связь между классами, которые рассматриваются как "братские" базовые классы. Такие классы-братья обычно должны проектироваться совместно. В большинстве случаев для этого не требуется особый стиль программирования, существенно отличающийся от того, который мы только что рассматривали. Просто на производный класс возлагается некоторая дополнительная работа. Обычно она сводится к переопределению одной или нескольких виртуальных функций. В некоторых случаях классы-братья должны иметь общую информацию. Поскольку С++ - язык со строгим контролем типов, общность информации возможна только при явном указании того, что является общим в этих классах. Способом такого указания может служить виртуальный базовый класс.

Виртуальный базовый класс можно использовать для представления "головного" класса, который может конкретизироваться разными способами:

class window { // головная информация virtual void draw(); };

Для простоты рассмотрим только один вид общей информации из класса window - функцию draw(). Можно определять разные более развитые классы, представляющие окна (window). В каждом определяется своя (более развитая) функция рисования (draw):

class window_w_border : public virtual window { // класс "окно с рамкой" // определения, связанные с рамкой void draw(); };

class window_w_menu : public virtual window { // класс "окно с меню" // определения, связанные с меню void draw(); };

Теперь хотелось бы определить окно с рамкой и меню:

class window_w_border_and_menu : public virtual window, public window_w_border, public window_w_menu { // класс "окно с рамкой и меню" void draw(); };




- Начало -  - Назад -  - Вперед -