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


Назад: Си++ = Си + классы + объектно-ориентированное


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

Сформулируем теперь свойство полиморфности уже с использованием терминов Си++. Пусть имеется базовый класс 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(). То же самое произойдет, если обрабатывать массив указателей в цикле:


p[0]-&#62f(); // Вызов a::f()


p[1]-&#62f(); // во всех трех случаях


p[2]-&#62f(); // по указателю на объект базового класса


for (i=0; i&#60=2; i++)
p[i]-&#62f();

Наличие указателя на объект базового класса A свидетельствует о том, что в данной точке программы транслятор не располагает информацией о том, объект какого из производных классов расположен под указателем.


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