Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 26

Если же в объект. типе нет мет с таким имен, компил. «подним вверх» по иерарх. объект., пока не найд. метод с таким именем. Если нужн. метод все же не буд найд., появ. сообщ. об ошиб.В наш случ если бы мет Showsum не был переопред., компил. нашел бы в род. типе Tstaff и вызвал.Вызв бы мет в свою очер. обрат бы к функц. Getsum, но имен к той ф, кот определ. в Tstaff, поск. они были откмпелиров. в одн. контексте – в типе Tstaff.Компил как бы проскоч. мимо метода Tteacher.Getsum не зам его.Связь метод  Tstaff. Showsum и Tstaff. Getsum жестко зад, тк была опред на этапе компил.Таким если статическ.(те опред на этапе компил.) наслед. метд найден и использ, то вызв им метод явл-ся в точн. таким, каким он был определ. и откомпил. для род типа.

Процесс когда сязь м/у метод определ. на этапе компил., наз ранним связыван.

31.ООП. Реализация позднего связывания. Виртуальные методы, их назначение и

правила использования.

Возникш. сит. напомин. ту. кот разреш в обычн Турбо Паскале введен. проц типов.

Так, сложн. подпрогр., например, вычисл. опред. интегр., перед. ту или иную подыинт.ф. как пр-р проц. типа.Без проц типа пришл. бы написать неск. подпрогр. – по подпрогр. для нахожд. интегр. от кажд. подыинт. ф.Эти подпрогр. были бы почти копиями и различ. бы только в местах вызова ф. Мы сделали подобн. образ., определ. метод Showsum  дважды: один раз в Tstaff, втор. – в Tteacher.

Если мы хотим иметь один метод Showsum, кот. вызыв. бы в завис. от ситуац. метод Tstaff.Getsum или Tteavher.Getsum ужно каким то образ. разорв. статическ. связь Showsum с вызываем. методами и отлож. реш., какую именно ф. Getsum нужно вызыв. до того мом-та, когда начнет выполн-ся пргр0мя и произ. вызов экземпл. Tteacher.Showsum.Такое связ. происх. на этапе выполн. на этапе вполн прогр., наз. позд. и достиг. введение виртуальн. методов.                                              

Вирт. методы предоставл. чрезвыч. мощн. инструм. для обобщен., кот. уже упомин-ся ранее, - полиморфизм.Полим-м позв.  путем привоен действ. имени, кот. использ. вей иерарх. объектов, выпол-ть это действ.жд. объекта иерарх.Чтобы опр-ть вирт метод надо указ. после его загол-ка в ообъект. типе слово virtual;в этом случ ссылки на метод опред. динам0ки – в ходе выполн. прогр. В нашем случ. вирт. метод. должны стать Tstaff.Getsum и Tteacher.Getsum Если сдлово virtual указ. в одн. из тпов. то и во всех потомках этого типа одноим. метод. должны быть указ. как виртуальн.Кроме того они должны иметь одинак. набор форм. пар-ов.Тогда один метод будет раб-ть по разн для разн. объектов.Работа с вирт. методами треб. соблюд. еще одного прав.: если объект. тип сод-т виртуальн. иетод, то он долж. сод-ть хотя  бы один метод, наз-ый конструкт-ом(constructor), кот мож быть определ. в самомобъекте или унаследов. им.Конструктор обязат должен быть примен к экземпляру объекта до первого вызов. вирт метода, в противн. случ. последств. будут непредсказ.

32.ООП. Виртуальные методы, правила их использования. Таблица виртуальных

методов. Конструктор.

Вирт.методы.....

В кач. конср-ра обычно опред мет., кот.устанавл. некот. нач. знач. экземпляра объекта.Причем недост. инициализир. один экземпл. объекта, а затем присвоить знач. этого экземпл. др.Констр-р должен быть выполн. для кажд. экземпл. В наш. случ констр. долж. быть Init(именно этим имен. обычн. наз в ООП)При этом слово Procedure замен. на Constructor.Конст-р помимо указ. в нем действ.,формир в экземпл. объекта необх. для вызова вирт. методов информацию. Для вирт методов кажд. типа компилятор созд.таблицу  с их адресами(так наз. табл вирт методов). При обращ. к констр. посл. заносит в спец. поле экемпляра объекта ссылку на тмв данного объектового типа. Таким образом осуществляется позднее связывание. В одном типе может быть любое число конструкторов. Конструкторы не могут быть виртуальными.

С учетом всего изложенного можно модифицировать модуль Persons. В целях экономии исключим из модуля абстрактный тип Tperson. Кроме того, при вызовах методов предка воспользуемся зарезервированным словом inherited, используя которое можно вызвать метод предка без указания его имени. Использование inherited может оказаться полезным в случае длинной иерархии объектов.