2017-03-31 59 views
0

我知道两者之间的区别。重写基本上可以让你“重新定义”你的子类中的方法,并且重载基本上可以让你用不同的参数或参数“重新定义”你的方法。尽管如此,我仍然对发生了什么事情感到困惑。我读过,当你重载一个方法时,编译器将会拥有所有重载方法,并找到最佳匹配或报告错误(如果不存在)。这显然是在编译期间完成的,但我对Override的工作原理感到困惑。我读过处理覆盖是非常困难的,因为你必须检查返回值类型与类层次结构相匹配,并且可以有很多级水平的检查C++方法覆盖和重载(编译级别)

(即一流的生活是超类人类和动物。人类和动物可以有许多派生类,这意味着我们将有一个深层次的阶级)。

没有得到太多的细节,如何重写工作在编译器级别,为什么它是压倒一切的是在运行时完成的,而不是编译时间?

回答

2

这取决于如果被覆盖方法是虚拟的或没有。如果重写的方法不是虚拟的,那么在通常情况下,重载方法的工作方式与重载相同,编译器会查看该对象的静态类型并基于该类型调用正确的函数。

对于具有虚拟方法的对象,通常使用一个虚函数表。这是虚拟方法的函数指针的集合。这是在运行时完成的原因是为了允许运行时多态性。生成vtable的通常方式是编译器将为每个类生成一个vtable,并在编译时使用所需的指针填充它,并将其包含在可执行文件中。然后构造函数将在类中设置一个隐藏的指针指向正确的vtable。在查找方法时,首先取消引用隐藏指针以查找vtable,然后从vtable中取消引用正确的槽。

+0

AHHHH首要用于多态性与多态性在运行时期间使用。有了这个逻辑,在运行时重写就应该是微不足道的! –

+0

还有一个问题。运行时vtables如何做以及如何/何时用函数指针填充? –

+0

@JustinCase我添加了关于vtable如何工作的更多细节。 – user1937198