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 адресі жазылады, ал бұл корректсіз(дұрыс емес).
Достарыңызбен бөлісу: |