我知道两者之间有什么区别。覆盖基本上可以让您“重新定义”子类中的方法,而重载基本上可以让您使用不同的参数或参数“重新定义”您的方法。不过,我对引擎盖下发生的事情有些困惑。我读到当你重载一个方法时,编译器将拥有所有重载的方法并找到最佳匹配或如果不存在则报告错误。这显然是在编译时完成的,但我对 Override 的工作方式感到困惑。我读过处理覆盖非常困难,因为您必须检查返回类型是否与类层次结构匹配,并且可能有很多类级别要检查
(即类 Living 是 Human 和 Animal 的超类。Human 和 Animal 可以有许多派生类,这意味着我们将拥有更深层次的类)。
不用太详细,覆盖如何在编译器级别工作,为什么覆盖是在运行时而不是编译时完成的?
这取决于被覆盖的方法是否是虚拟的。如果被覆盖的方法不是虚拟的,那么在幕后它通常以与重载相同的方式工作,编译器查看对象的静态类型并基于此调用正确的函数。
对于具有虚拟方法的对象,通常使用 vtable。这是指向虚方法的函数指针的集合。在运行时完成的原因是允许运行时多态性。生成 vtable 的通常方式是编译器将为每个类生成单个 vtable,并在编译时用所需的指针填充它,并将其包含在可执行文件中。然后构造函数将在类中设置一个隐藏的指针以指向正确的 vtable。在查找方法时,它首先取消引用隐藏指针以找到 vtable,然后从 vtable 中取消引用正确的插槽。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句