C++方法重写和重载(编译器级别)
C++ Method Override and Overloading (Compiler level)
我知道两者有什么区别。重写基本上可以让你"重新定义"你是子类中的一个方法,重载基本上是让你用不同的参数或参数"重新定义"你的方法。不过,我对引擎盖下发生的事情有点困惑。我读到当你重载一个方法时,编译器将拥有所有重载的方法,并找到最佳匹配项或报告错误(如果不存在)。这显然是在编译时完成的,但我对覆盖的工作原理感到困惑。我读过处理覆盖非常困难,因为您必须检查返回类型是否与类层次结构匹配,并且可能有很多类级别需要检查
(即.class生活是人类和动物的超级阶级。人类和动物可以有许多派生类,这意味着我们将有一个深层次的类)。
在不赘述的情况下,重写如何在编译器级别工作,为什么覆盖是在运行时而不是编译时完成的?
这取决于重写的方法是否是虚拟的。如果重写的方法不是虚拟的,那么在后台它通常以与重载相同的方式工作,编译器查看对象的静态类型并基于此调用正确的函数。
对于具有虚拟方法的对象,通常使用 vtable。这是指向虚拟方法的函数指针的集合。这样做在运行时的原因是允许运行时多态性。生成 vtable 的通常方式是编译器将为每个类生成一个 vtable,并在编译时使用所需的指针填充它,并将其包含在可执行文件中。然后,构造函数将在类中设置一个隐藏指针以指向正确的 vtable。查找方法时,它首先取消引用隐藏指针以查找 vtable,然后从 vtable 取消引用正确的插槽。
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 编译器无法找到重载
- msvc 编译器(和其他编译器)如何知道要绑定到哪个 std 重载?
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 如何让编译器知道要调用函数的哪个重载以避免歧义?
- 编译器无法推断 std::max 的重载
- 如何让编译器在C++中更喜欢常量方法重载?
- 模板实例化失败:编译器选择不正确的重载函数
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 编译器选择错误的重载函数
- 运算符重载关联性编译器优化
- C++方法重写和重载(编译器级别)
- 我重载了一个运算符*()函数来计算两个矩阵的总和,但编译器提示此错误
- 跨编译器的 constexpr 成员函数的重载解析不一致
- 运算符重载和函数重载产生不明确的编译器错误
- MSVC编译器错误将模板与枚举参数重载时
- 强制编译器选择常量运算符重载
- C++/编译器/重载中的二维数组