С++ для начинающих



         

Объектно-ориентированное проектирование - часть 3


Хотя для полиморфной манипуляции объектом требуется, чтобы доступ к нему осуществлялся с помощью указателя или ссылки, сам по себе факт их использования не обязательно приводит к полиморфизму. Рассмотрим такие объявления:

// полиморфизма нет

int *pi;

// нет поддержанного языком полиморфизма

void *pvi;

// pquery может адресовать объект любого производного от Query класса

Query *pquery;

В C++ полиморфизм существует только в пределах отдельных иерархий классов. Указатели типа void* можно назвать полиморфными, но в языке их поддержка не предусмотрена. Такими указателями программист должен управлять самостоятельно, с помощью явных приведений типов и той или иной формы дискриминанта, показывающего, объект какого типа в данный момент адресуется. (Можно сказать, что это “второсортные” полиморфные объекты.)

Язык C++ обеспечивает поддержку полиморфизма следующими способами:

  • путем неявного преобразования указателя или ссылки на производный класс к указателю или ссылке на открытый базовый:
  • Query *pquery = new NameQuery( "Class" );

  • через механизм виртуальных функций:
  • pquery->eval();

  • с помощью операторов dynamic_cast и typeid (они подробно обсуждаются в разделе 19.1):
  • if ( NameQuery *pnq =

         dynamic_cast< NameQuery* >( pquery )) ...

    Проблему представления запроса мы решим, определив каждый операнд в классах AndQuery, NotQuery и OrQuery как указатель на тип Query*. Например:

    class AndQuery {

    public:

       // ...

    private:

       Query *_lop;

       Query *_rop;

    };

    Теперь оба операнда могут адресовать объект любого класса, производного от абстрактного базового класса Query, без учета того, определен он уже сейчас или появится в будущем. Благодаря механизму виртуальных функций, вычисление операнда, происходящее во время выполнения программы, не зависит от фактического типа:

    _rop->eval();

    На рис. 17.1 показана иерархия наследования, состоящая из абстрактного класса Query и четырех производных от него классов. Как этот рисунок транслируется в код программы на C++?




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