2014-02-07 31 views
4

假设我有一个名为ClothingStore的类。该课程有3个成员功能,指向访问商店正确部门的访问者。会员职能是儿童部门,男子部门和妇女部门,具体取决于访问者是小孩,男性还是女性。函数重载如何在运行时工作,以及为什么会重载?

函数重载可用于使3个函数具有相同的名称,比如PointToDept,但采用不同的输入参数(儿童,男人,女人)。

执行程序时在运行时实际发生了什么?

我的猜测是编译器将switch语句添加到程序中,以选择正确的成员函数。但是,这让我怀疑 - 在使用重载函数时,程序性能方面是否有任何好处,而不是使用switch语句创建自己的函数?同样,我唯一的结论就是代码可读性。谢谢。

+11

编译器可以看到三个不同的功能就好像他们被不同的名称。 (编译器)通过查看参数类型和“模式匹配”以及参数类型在每个调用站点调用哪个函数。没有switch语句。该调用只是针对具有匹配参数的独特功能。如果编译器找不到匹配项(因为不符合C++重载解析规则),则会收到编译时错误消息。 – Gene

+0

请参阅http:// en。wikipedia.org/wiki/Ad_hoc_polymorphism#Early_binding –

+0

“为什么超载?” - 因为它允许您编写客户端代码,即使其提供的数据类型发生更改,也不需要将其调用更改为重载函数。这对于普通的客户端代码来说很方便 - 只是在开发或维护编程期间它会演变为使用另一种类型,但当客户端说可以从其调用者接受任何类型的模板时,这一点至关重要:如果模板可以调用重载函数使用相同的源代码,一种形式的多态(重载)干净地支持其他(模板)。 –

回答

3

编译器会看到三个不同的函数,就像它们被命名不同一样。

在大多数编译器的情况下,它们被命名不同。这个过去被称为“name mangling”,其中函数名称前缀为返回类型,后缀为参数类型。

http://en.wikipedia.org/wiki/Name_mangling

6

我的猜测是编译器向程序中添加了switch语句来选择正确的成员函数。

这是一个糟糕的猜测。 C++是一种静态类型语言。运行时变量的类型不会更改。这意味着决定调用哪个非多态重载是始终可以在编译时进行的。标准章节13.3,过载分辨率,确保情况如此。当编译时做出决定时,没有理由做出运行时决定。在大多数实现中具有非多态重载函数的运行时成本为零。唯一的例外可能是C++解释器。

3

如何在运行时

函数重载工作没有。它在编译时工作。对于重载函数的调用在运行时从调用到非重载函数是没有区别的。

为什么超载? ...在使用重载函数时,程序性能方面是否有任何好处,而不是使用switch语句创建自己的函数?

是的。与“用switch语句创建自己的函数”相比,没有任何运行时开销。

相关问题