C++方法重写和重载(编译器级别)

C++ Method Override and Overloading (Compiler level)

本文关键字:编译器 重载 方法 重写 C++      更新时间:2023-10-16

我知道两者有什么区别。重写基本上可以让你"重新定义"你是子类中的一个方法,重载基本上是让你用不同的参数或参数"重新定义"你的方法。不过,我对引擎盖下发生的事情有点困惑。我读到当你重载一个方法时,编译器将拥有所有重载的方法,并找到最佳匹配项或报告错误(如果不存在)。这显然是在编译时完成的,但我对覆盖的工作原理感到困惑。我读过处理覆盖非常困难,因为您必须检查返回类型是否与类层次结构匹配,并且可能有很多类级别需要检查

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

在不赘述的情况下,重写如何在编译器级别工作,为什么覆盖是在运行时而不是编译时完成的?

这取决于重写的方法是否是虚拟的。如果重写的方法不是虚拟的,那么在后台它通常以与重载相同的方式工作,编译器查看对象的静态类型并基于此调用正确的函数。

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