假设您有 aTAncestorClass
及其后代TDescendantClass1
和TDescendantClass2
。还假设后代只是在一些不同的覆盖虚拟方法中彼此不同。否则所有字段都是相同的。也就是说,物理上的实际对象是相同的,只是它们的 VMT 不同。
TAncestorClass = class
...
procedure VirtualProc; virtual; abstract;
...
end;
TDescendantClass1 = class(TAncestorClass)
procedure VirtualProc; override;
end;
TDescendantClass2 = class(TAncestorClass)
procedure VirtualProc; override;
end;
到目前为止没有什么特别的。
问题是我想在需要这个东西的任何时候动态地改变一个已经创建的对象,TDescendantClass1
反之亦然TDescendantClass2
。不像第一眼看上去那么难看——因为这些物体本质上是一样的。我只想在每次类型更改后调用适当的虚拟方法。理论上替换 VMT(或只是与 VMT 不同的区域)就足够了,但是这 - 否则简单而琐碎的 hack - 非常肮脏,没有人想在他的代码中使用这些东西。但是“干净”的方式——用正确的类创建一个新对象,然后复制并释放原来的对象——显然是没有问题的。
那么,有人有更体面的想法来做到这一点吗?