在面向对象的编程中,有时能够修改已创建对象的行为是件好事。当然,这可以通过策略模式等相对冗长的技术来完成。但是,有时通过在实例化后更改 vtable 指针来完全更改对象的类型会很好。如果您从 A 类切换到 B 类,这将是安全的:
- B 类是 A 类的子类,不添加任何新字段,或
- B 类和 A 类具有相同的父类。除了覆盖父类的虚函数之外,什么都不做。(没有新字段或虚函数。)
- 在任何一种情况下,A 和 B 都必须具有相同的不变量。
这在 C++ 和 D 编程语言中是可以破解的,因为指针可以任意转换,但它是如此丑陋且难以理解,以至于我害怕在需要被其他人理解的代码中这样做。为什么通常不提供更高级别的方法来执行此操作?