Информатика и технология программирования


Двоичное дерево - часть 9



void f2();
};
A *pa;
B *pb;
B x;
pa = &#38x;
// Неявное преобразование указателя на объект


// класса B в указатель на объект класса A


pa-&#62f1();
// Вызов функции из вложенного объекта базового


// класса A::f1(), хотя она переопределена


Обратное преобразование от указателя на базовый класс к указателю на производный может быть сделано только явно. Преобразование будет корректно, если данный объект базового класса действительно входит в объект того производного класса, к типу указателя которого оно выполняется:


pb = (B*) pa; // Обратное преобразование - явное


pb -&#62f2(); // Корректно, если под "pa" был объект класса "B"

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

Сформулируем теперь свойство полиморфности уже с использованием терминов Си++. Пусть имеется базовый класс A и производные классы B,C. В классе А определена функция -элемент f(), в классах B,C -унаследована и переопределена. Пусть теперь имеется массив указателей на объекты базового класса -p. Он инициализирован как указателями на объекты класса A, так и на объекты производных классов B,C (точнее, на вложенные в них объекты базового класса A):


class a
{ ... void f(); };
class b : public a
{ ... void f(); };
class c : public a
{ ... void f(); };
a A1;
b B1;
c C1;
a *p[3] = { &#38B1, &#38C1, &#38A1 };














Как будет происходить вызов обычной неполиморфной функции при использовании указателей из этого массива ? Очевидно, что транслятор, располагая исключительно информацией о том, что указуемыми переменными являются объекты базового класса A (что следует из определения массива), вызовет во всех случаях функцию a::f().


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



Книжный магазин