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

以防万一

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

(即类 Living 是 Human 和 Animal 的超类。Human 和 Animal 可以有许多派生类,这意味着我们将拥有更深层次的类)。

不用太详细,覆盖如何在编译器级别工作,为什么覆盖是在运行时而不是编译时完成的?

用户1937198

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#编译器如何区分抽象方法的具体子类impl和抽象库中的重载?

来自分类Dev

C#:从 IEnumerable 读取多态对象时,让编译器调用正确的方法重载

来自分类Dev

编译器无法识别重载的构造函数C ++

来自分类Dev

C ++编译器选择了错误的重载函数

来自分类Dev

C ++ gcc函数模板重载编译器问题

来自分类Dev

C,编译器错误和指针

来自分类Dev

在C ++和编译器中内联

来自分类Dev

C ++编译器是否将所有后缀运算符重载都视为相同(-和-的后缀版本)?

来自分类Dev

C ++:来自DLL的编译器错误覆盖功能

来自分类Dev

编译器如何编译模板和类型检查?(C ++)

来自分类Dev

本机c ++编译器和.net c ++编译器有什么区别?

来自分类Dev

Turbo C ++和Borland C ++编译器之间的区别

来自分类Dev

Objective-C编译器和编辑器

来自分类Dev

Keil C编译器中的strcpy和strcat

来自分类Dev

C ++ inline关键字和编译器优化

来自分类Dev

iOS和Android开发的C编译器差异

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

具有不同编译器的C ++和varargs

来自分类Dev

static_assert和Intel C ++编译器

来自分类Dev

使用haxe作为C ++和JavaScript之间的编译器

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

使用GCC在C中进行函数重载-编译器警告

来自分类Dev

涉及“使用”别名的成员函数重载解析中的Intel C ++编译器错误?

来自分类Dev

C ++编译器无法使用我的重载<运算符进行位集键比较

来自分类Dev

C#编译器如何处理重载显式强制转换运算符?

来自分类Dev

GNU C++编译器g++的优化级别表,准确吗?

来自分类Dev

当指定类型的运算符重载存在时,C#编译器如何确定泛型方法中的引用相等性?

来自分类Dev

当指定类型的运算符重载存在时,C#编译器如何确定泛型方法中的引用相等性?

来自分类Dev

C ++编译器输出

Related 相关文章

  1. 1

    C#编译器如何区分抽象方法的具体子类impl和抽象库中的重载?

  2. 2

    C#:从 IEnumerable 读取多态对象时,让编译器调用正确的方法重载

  3. 3

    编译器无法识别重载的构造函数C ++

  4. 4

    C ++编译器选择了错误的重载函数

  5. 5

    C ++ gcc函数模板重载编译器问题

  6. 6

    C,编译器错误和指针

  7. 7

    在C ++和编译器中内联

  8. 8

    C ++编译器是否将所有后缀运算符重载都视为相同(-和-的后缀版本)?

  9. 9

    C ++:来自DLL的编译器错误覆盖功能

  10. 10

    编译器如何编译模板和类型检查?(C ++)

  11. 11

    本机c ++编译器和.net c ++编译器有什么区别?

  12. 12

    Turbo C ++和Borland C ++编译器之间的区别

  13. 13

    Objective-C编译器和编辑器

  14. 14

    Keil C编译器中的strcpy和strcat

  15. 15

    C ++ inline关键字和编译器优化

  16. 16

    iOS和Android开发的C编译器差异

  17. 17

    C和DLC编译器的奇怪解析错误

  18. 18

    具有不同编译器的C ++和varargs

  19. 19

    static_assert和Intel C ++编译器

  20. 20

    使用haxe作为C ++和JavaScript之间的编译器

  21. 21

    C和DLC编译器的奇怪解析错误

  22. 22

    使用GCC在C中进行函数重载-编译器警告

  23. 23

    涉及“使用”别名的成员函数重载解析中的Intel C ++编译器错误?

  24. 24

    C ++编译器无法使用我的重载<运算符进行位集键比较

  25. 25

    C#编译器如何处理重载显式强制转换运算符?

  26. 26

    GNU C++编译器g++的优化级别表,准确吗?

  27. 27

    当指定类型的运算符重载存在时,C#编译器如何确定泛型方法中的引用相等性?

  28. 28

    当指定类型的运算符重载存在时,C#编译器如何确定泛型方法中的引用相等性?

  29. 29

    C ++编译器输出

热门标签

归档