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

UptoLike

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

{ SymbolLocation SymLoc(1,1,'A');
StringLocation StrLoc(1,1,"ABC");
Location* LocPtr;
SymbolLocation* SymLocPtr=&SymLoc;
StringLocation* StrLocPtr=&StrLoc;
SymbolLocation& SymLocRef=SymLoc;
StringLocation& StrLocRef=StrLoc;
Print(SymLocPtr);/*-выдача символа на экран; */
Print(StrLocPtr);/*-выдача строки на экран; */
LocPtr=SymLocPtr;
Print(LocPtr); /*-выдача символа на экран; */
LocPtr=StrLocPtr;
Print(LocPtr); /*-выдача строки на экран; */
Print(SymLocRef);/*-выдача символа на экран; */
Print(StrLocRef);/*-выдача строки на экран; */
} /*-конец программы выдачи полиморфного объекта; */
Поскольку базовый класс может быть закрыт для производно-
го,когда не используется спецификатор доступа public в опре-
делении этого производного класса,то для классов в этом слу-
чае неявное преобразование указателя производного класса в
указатель базового класса не имеет места.
Модифицированный оператор присваивания для указателей и ссы-
лок составных типов является необходимым,но не достаточным
средством обработки полиморфных объектов.Теперь необходимо вы-
яснить,каким образом установить по указателю базового типа тип
обрабатываемого объекта с тем,чтобы вызвать требуемую функцию
обработки.Существуют два основных способа решения этой пробле-
мы в языке С++:
1)использовать виртуальные функции,когда объекты автомати-
чески получают связь со своим типом;
2)поместить в базовый класс специальное поле типа - дискри-
минант,который смогут просматривать функции.
И в том,и в другом случае используются указатели или ссылки
на базовые типы,которые конструируются как контейнерные или
вмещающие типы в виде множеств,векторов или списков.Получае-
мые при этом неоднородные списки объектов облегчают програм-
42
      { SymbolLocation SymLoc(1,1,'A');
        StringLocation StrLoc(1,1,"ABC");
              Location* LocPtr;
        SymbolLocation* SymLocPtr=&SymLoc;
        StringLocation* StrLocPtr=&StrLoc;
        SymbolLocation& SymLocRef=SymLoc;
        StringLocation& StrLocRef=StrLoc;
        Print(SymLocPtr);/*-выдача символа на экран;          */
        Print(StrLocPtr);/*-выдача строки на экран;           */
        LocPtr=SymLocPtr;
        Print(LocPtr);      /*-выдача символа на экран;       */
        LocPtr=StrLocPtr;
        Print(LocPtr);      /*-выдача строки на экран;        */
        Print(SymLocRef);/*-выдача символа на экран;          */
        Print(StrLocRef);/*-выдача строки на экран;           */
      } /*-конец программы выдачи полиморфного объекта;        */


 Поскольку базовый класс может быть закрыт для производно-
го,когда не используется спецификатор доступа public в опре-
делении этого производного класса,то для классов в этом слу-
чае неявное преобразование указателя производного класса в
указатель базового класса не имеет места.
  Модифицированный оператор присваивания для указателей и ссы-
лок составных типов является необходимым,но не достаточным
средством обработки полиморфных объектов.Теперь необходимо вы-
яснить,каким образом установить по указателю базового типа тип
обрабатываемого объекта с тем,чтобы вызвать требуемую функцию
обработки.Существуют два основных способа решения этой пробле-
мы в языке С++:
  1)использовать виртуальные функции,когда объекты автомати-
чески получают связь со своим типом;
  2)поместить в базовый класс специальное поле типа - дискри-
минант,который смогут просматривать функции.
  И в том,и в другом случае используются указатели или ссылки
на базовые типы,которые конструируются как контейнерные или
вмещающие типы в виде множеств,векторов или списков.Получае-
мые при этом неоднородные списки объектов облегчают програм-


                              42