Вы пытаетесь сравнить три совершенно разные сущности.
@ test возвращает адрес переменной test, а не экземпляр объекта, на который он указывает.
test.getClassPointer () возвращает адрес метаданных класса, постоянную структуру данных, сгенерированную компилятором, где среда выполнения может найти таблицу виртуальных методов, таблицы информации о типах среды выполнения и многое другое. Все экземпляры класса имеют одинаковую структуру метаданных класса. Указатель на метаданные класса является идентификатором типа экземпляра объекта - это то, как объект знает, какой это тип во время выполнения.
test.getSelfPointer () выдает фактический адрес экземпляра объекта в памяти. Два экземпляра объекта (созданные отдельно) будут иметь разные адреса экземпляров. test.getSelfPointer () будет равен содержанию переменной экземпляра теста: Pointer (test)
Например (псевдокод, не тестировался):
type TTest = class
end;
var test1: TTest;
test2: TTest;
begin
test1 = TTest.Create; // allocates memory from the global heap, stores pointer
test2 = test1; // copies the pointer to the object into test2 variable
writeln("Test1 variable points to: ", IntToHex(Integer(Pointer(test1))));
writeln("Test2 variable points to: ", IntToHex(Integer(Pointer(test1))));
end.