C++中如何区分重载函数的地址?

来源:百度知道 编辑:UC知道 时间:2024/06/02 13:07:30
如果有两个重载函数,如何区分它们的地址呢?
void MyFunc(int a) { }
void MyFunc(int a, int b) { }

那么&MyFunc就会有二义性,怎样把这两个函数区分开呢?
关于snower的回答:
对重载函数的调用,实际上是编译时刻的静态绑定,所以&MyFunc一定会有确定的地址,执行f=&MyFunc之后,f的地址也已经是确定的了,那么执行f(i)的时候不会再去动态判断应该调用哪个函数。并且这段代码在编译的时候就是错误的,f=&MyFunc不能编译通过。
非常感谢你的回答,呵呵。

用一个类型转换就可以
typedef void OnePara(int);
typedef void TwoParas(int, int);

然后 (OnePara*)&MyFunc 就是单参数的函数地址, (TwoParas*)&MyFunc就是双参数的

&MyFunc看上去有问题,但是在调用函数的时候必须带有参数,系统会根据参数的类型判断调用的是哪个函数。比如有如下语句:
int i,j;
void *f();
f=&MyFunc;
f(i);
则调用的就是上一个函数。如果是f(i,j);
则调用的是下一下函数。这个不是编程人员关心的事,系统会自动识别。

在编译器看来, 重载函数根本就是完全不同的几个函数, 当然就会有不同的函数地址;

我们用常规方法获取的地址只是第一种重载的地址.

没有二义性,函数名称一样并不代表他们就是同一个函数。这2个函数对于编译器来说完全是不同的2个符号。你编译好你的这个例子,查看PE结构,就会看见函数的名字是像?MyFunc@@YAHHH@Z。

关注