Переменная, тип которой нисходит, на самом деле является указателем на экземпляр.Address Value +-----------------+ 12345600 | Obj variable | 45680000 +-----------------+ | v +-----------------+ 45680000 | instance | | | | | +-----------------+
Так же Obj
является указателем на экземпляр. Но @Obj
это адрес указателя на экземпляр. То есть есть дополнительный уровень косвенности.
FWIW оба этих параметра не имеют смысла и не принесут ничего полезного.
Что касается различного поведения при удалении virtual
директивы, виртуальный метод отправляется с использованием типа среды выполнения экземпляра, то не виртуальный метод отправляется с использованием типа времени компиляции переменной экземпляра. Тот факт, что код работает вообще, связан с двумя несвязанными классами, имеющими совместимые VMT. Но это всего лишь шанс детализации реализации.