«Қазақстан тарихы, жалпы білім беру пәндері және ақпараттық жүйелер» кафедрасы


Конструкторды корректсіз қолданудың мысалы



бет47/105
Дата09.08.2020
өлшемі0,51 Mb.
#76246
түріЛекция
1   ...   43   44   45   46   47   48   49   50   ...   105
    Бұл бет үшін навигация:
  • B^.Init
3. Конструкторды корректсіз қолданудың мысалы.

type TA = object

.........



constructor init; procedure Initialization;

.........



end; PA = ^TA;

TB = object(TA)

......... end; PB = ^TB;

procedure Initialization;

begin

Init; {конструкторды шақыру, Self.Init – рекомендацияға жат!}

........... end;

................ var B:PB;

................

new(B);


B^.Init; {мұраға алынған конструктор шақырылып тұр, бұлай етуге болады }

B^.Initialization; {VMT-ң көрсеткіші бұзылады!}

Келтіріліген мысалда TA классы және оның мұрагері TB жарияланған. TA классында конструктор жарияланған және осы конструктордың тәсілін ӛз ішіне алатын тәсіл жарияланған(бұлай етуге кеңес бермейміз). TB классында осы конструктор мен тәсіл мұраға алынған. B^.Init шақыруы мұраға алынған конструкторды дұрыс (коррект)шақыруға әкеледі. Бұған дейін компилятор B^ объектінің VMT ӛрісін инициализациялау кодын генерациялап қояды. Ӛйткені, адрестелетін В мәні TB типіне ие. Келесі B^.Initialization шақыруы мұраға алынған тәсілді шақыруға әкеледі, ал, оның ішінде конструктор қайтадан шақырылады. Осы тәсілдің ішінде конструкторды шақыру Self-ке қатысты орындалады, ал бұл Self осы тәсілдің контексінде TA типіне ие. Сондықтан, нәтижеде, Self ретінде берілген B^ объекті, қайта инициализацияланатын болады және оның VMT ӛрісіне ТА классының VMT адресі жазылады, ал бұл корректсіз(дұрыс емес).





Достарыңызбен бөлісу:
1   ...   43   44   45   46   47   48   49   50   ...   105




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет