Re: Типизированные/нетипизированные указатели.
Добавлено: 10 сен 2007, 15:24
Кстати, если все типы (IntegerType, RealType etc. ) объявить наследниками от некоего базового типа (NumbersType), то пользоваться можно указателем именно на этот базовый тип, а реальный тип во время выполнения в Delphi можно определить, используя, например оператор is.
В Паскале еще была такая функция как TypeOf, вот паскалевский Help, с примером.
Интересна фраза Can only be applied to object types that have a VMT; all other types result in an error. Т.е. у этих объектов (классов) должны иметься виртуальные методы (иначае VMT как раз и бдет отсутствовать)
В Паскале еще была такая функция как TypeOf, вот паскалевский Help, с примером.
Интересна фраза Can only be applied to object types that have a VMT; all other types result in an error. Т.е. у этих объектов (классов) должны иметься виртуальные методы (иначае VMT как раз и бдет отсутствовать)
Код: Выделить всё
TypeOf (function)
===================
Returns a pointer to an object type's virtual method table.
Declaration:
procedure TypeOf (Param1: ObjectType) : Pointer
Target:
Windows, Real, Protected
Remarks:
Param1 is either an object type identifier or an instance of an object type
Can only be applied to object types that have a VMT; all other types result
in an error.
See Also:
SizeOf
SampleCode:
{Typeof.PAS}
{Sample code for the TypeOf function.}
{ For Windows: }
{ uses WinCrt; }
uses Objects;
type
PBaseObject = ^TBaseObject;
TBaseObject = object(TObject)
end;
PChildObject = ^TChildObject;
TChildObject = object(TBaseObject)
end;
var
P,Q : PObject; { abstract object pointer }
begin
P := New(PBaseObject, Init);
Q := New(PChildObject, Init);
if TypeOf(P^) = TypeOf(TBaseObject) then
writeln('P is a TBaseObject instance')
else
writeln('P is not a TBaseObject instance');
if TypeOf(Q^) = TypeOf(TChildObject) then
writeln('Q is a TChildObject instance')
else
writeln('Q is not a TChildObject instance');
if TypeOf(Q^) <> TypeOf(P^) then
writeln('Q is not the same kind of object instance as P');
Dispose(P, Done);
Dispose(Q, Done);
end.