Правила программирования на Си и Си++



         

101. Си++ — это не Smalltalk: избегайте общего класса object - часть 4


есть mother и father, у каждого из которых есть parent. Проблема с philip.go_to_sleep()

состоит в том, что компилятор не знает, какой из объектов parent должен получить это сообщение: тот, который в mother, или тот, который в father.8

Одним из путей решения этой проблемы является введение уточняющей функции, которая направляет сообщение нужному классу (или обоим):

class parent { public: go_to_sleep(); };

class mother : public parent {};

class father : public parent {};

class child : public mother, public

father

{

public:

   go_to_sleep()

   {

      mother::go_to_sleep();

      father::go_to_sleep();

   }

}

Другим решением является виртуальный базовый класс:

class parent {};

class mother : virtual public

parent {};

class father : virtual public

parent {};

class child  : public mother, public

father {}

который заставляет компилятор помещать в объект child лишь один объект parent,

совместно используемый объектами mother и father. Двусмысленность исчезает, но появляются другие проблемы. Во-первых, нет возможности показать на уровне потомка, хотите вы или нет виртуальный базовый класс. Например, в следующем коде tree_list_node

может быть членом как дерева, так и списка одновременно:

class node;

class list_node : public node {};

class tree_node : public node {};

class tree_list_node : public list_node, public tree_node {};

В следующем варианте tree_list_node может быть членом или дерева, или списка, но не обоих одновременно:

class node;

class list_node : virtual public node {};

class tree_node : virtual public node {};

class tree_list_node : public list_node, public tree_node {};

Вам бы хотелось делать этот выбор при создании tree_list_node, но такой возможности нет.

Второй проблемой является инициализация. Конструкторы в list_node и tree_node, вероятно, инициализируют базовый класс node, но разными значениями. Если имеется всего один node, то какой из конструкторов выполнит эту инициализацию? Ответ неприятный. Инициализировать node




Содержание  Назад  Вперед