-vo3 选项指示编译器将所有方法(包括 ACCESS 和 ASSIGN 方法)都视为虚方法。
-vo3[+|-]
+ | - | 指定 + 或 -vo3,编译器就会将所有方法(包括 ACCESS 和 ASSIGN 方法)视为虚方法,无论是否使用 VIRTUAL 修饰符。这提供了与 Visual Objects 继承模型的兼容性。 |
备注
无论是否使用 -vo3,类方法都可以通过 VIRTUAL 关键字明确声明为虚方法。
出于性能考虑,该选项默认为关闭。由于在运行前无法确定实际调用的方法实现,并且取决于调用实例的运行时类型,因此虚方法会带来轻微的性能损失。与此相反,对非虚拟成员的调用可以在编译时完全解决,并且调用总是针对实例的编译时类型。
要在 Visual Studio 开发环境中设置该编译器选项,请执行以下操作
1.打开项目的 "属性"页面
2.点击 Dialect 选项卡
3.更改值
4.查看属性页
CLASS BaseClass
METHOD WhoAmI() AS STRING
RETURN "BaseClass"
END CLASS
CLASS DerivedClass INHERIT BaseClass
METHOD WhoAmI() AS STRING
RETURN "DerivedClass"
END CLASS
FUNCTION Start() AS VOID
LOCAL c AS BaseClass
c := DerivedClass{}
? c:WhoAmI()
RETURN
// 使用默认值或 /vo3- 输出:BaseClass
// 使用 /vo3 或 /vo3+ 输出: DerivedClass
如果不使用 -vo3 开关,对 "c:WhoAmI() "的调用总是解析到 BaseClass 中的实现,因为变量 "c "的类型是 "BaseClass",而 "BaseClass.WhoAmI "是一个非虚拟方法。
当使用 -vo3 开关时,对 "c:WhoAmI() "的调用将解析到 "DerivedClass "中的实现。尽管变量 "c "的类型是 "BaseClass",但由于 "BaseClass.WhoAmI "是一个虚方法,因此运行时 "c "中存储的实例的实际类型将决定调用 "WhoAmI "的哪种实现。
如果不使用 -vo3,也可以通过以下方法获得同样的效果:
VIRTUAL METHOD WhoAmI() AS STRING CLASS BaseClass
...
这比使用 -vo3 更可取,因为您可以明确控制哪些方法是虚拟的,哪些不是,而且在不需要虚拟继承的地方也不会产生不必要的开销。但是,如果不使用 -vo3,现有的 Visual Objects 代码可能无法正常工作,而且修改现有代码并在真正需要的方法中添加 VIRTUAL 关键字可能也不现实。