Объектно-ориентированный язык программирования С++ в примерах. Сивохин А.В. - 38 стр.

UptoLike

Составители: 

3.В определении типов,составляющих иерархию,должны обязатель-
но определяться конструкторы типов, производящих инициализа-
цию соответствующих объектов и обеспечивающих взаимосвязь с
таблицей виртуальных функций,которую строит компилятор в этом
случае.В итоге все объекты,сконструированные этими конструк-
торами,имеют связь с таблицей виртуальных функций соответству-
ющего типа.
Важно отметить,что таблица виртуальных функций - одна для
каждого типа,а не у каждой переменной того или иного типа.Пе-
ременная,или объект,лишь держит связь с таблицей своего типа,
которую установил конструктор.Когда в программе встречается
полиморфный объект,имеющий виртуальные функции,производится
идентификация его типа,после чего по указанной связи находят-
ся реализации виртуальных функций,соответствующие установлен-
ному типу пoлиморфного объекта.Все это делается во время ис-
полнения программы.Более того,если тип Z наследует от типа Y
виртуальную функцию,вызывающую другие функции,то последние
вызовы будут относиться к функциям типа Z,а не Y.В случае
статических методов все было бы наоборот:вызовы не "верну-
лись" бы в Z.
Напишем программу печати полиморфного объекта с использо-
ванием виртуальных полиморфных функций:
class Location /*-базовый класс позиция; */
{ int x,y;/*-координаты точки экрана: */
public: /*-открытая часть класса; */
Location(int InitX,int InitY)/*-конструктор точки;*/
{ x=InitX;/*-инициализация абсциссы; */
y=InitY;/*-инициализация ординаты; */
}/*-конец определения конструктора точки; */
~Location() { } /*-пустой деструктор класса; */
virtual void Print() const=0;/*-чисто виртуаль- */
/* ная функция; */
};/*-конец определения базового класса позиция; */
38
 3.В определении типов,составляющих иерархию,должны обязатель-
но определяться конструкторы типов, производящих   инициализа-
цию соответствующих объектов и обеспечивающих   взаимосвязь    с
таблицей виртуальных функций,которую строит компилятор в этом
случае.В итоге все объекты,сконструированные этими конструк-
торами,имеют связь с таблицей виртуальных функций соответству-
ющего типа.
  Важно отметить,что таблица виртуальных функций - одна для
каждого типа,а не у каждой переменной того или иного типа.Пе-
ременная,или объект,лишь держит связь с таблицей своего типа,
которую установил конструктор.Когда в программе встречается
полиморфный объект,имеющий виртуальные функции,производится
идентификация его типа,после чего по указанной связи находят-
ся реализации виртуальных функций,соответствующие установлен-
ному типу пoлиморфного объекта.Все это делается во время ис-
полнения программы.Более того,если тип Z наследует от типа Y
виртуальную функцию,вызывающую другие функции,то последние
вызовы будут относиться к функциям типа Z,а не Y.В случае
статических методов все было бы наоборот:вызовы не "верну-
лись" бы в Z.
  Напишем программу печати полиморфного объекта с использо-
ванием виртуальных полиморфных функций:


  class Location /*-базовый класс позиция;                     */
        { int x,y;/*-координаты точки экрана:                  */
    public: /*-открытая часть класса;                          */
          Location(int InitX,int InitY)/*-конструктор точки;*/
                  { x=InitX;/*-инициализация абсциссы;         */
                    y=InitY;/*-инициализация ординаты;         */
                  }/*-конец определения конструктора точки; */
         ~Location() { } /*-пустой деструктор класса;          */
          virtual void Print() const=0;/*-чисто виртуаль-      */
                                        /* ная функция;        */
        };/*-конец определения базового класса позиция;        */


                            38