面试题答案
一键面试1. 函数调用匹配过程分析
callFunc(d, 5);
:- 首先,
callFunc
函数有两个重载版本,void callFunc(Base& obj, int a)
和void callFunc(Derived& obj, double a)
。 - 实参
d
是Derived
类型,它可以隐式转换为Base
类型,5
是int
类型。第一个版本void callFunc(Base& obj, int a)
匹配度更高,因为Derived
到Base
的转换是标准转换,且int
类型匹配。 - 在
callFunc(Base& obj, int a)
函数中,obj.func(a)
调用虚函数func
。由于obj
实际类型是Derived
,根据虚函数机制,会调用Derived
类中被重写的虚函数。但Derived
类中没有重写void func(int a)
,而是继承自Base
类,所以会调用Base::func(int)
,输出Base::func(int)
。
- 首先,
callFunc(d, 5.5);
:- 对于
callFunc
函数的重载版本,void callFunc(Base& obj, int a)
不匹配,因为5.5
是double
类型,与int
不匹配。 void callFunc(Derived& obj, double a)
匹配,因为d
是Derived
类型,5.5
是double
类型。- 然后在这个函数中调用
obj.func(a)
,会调用Derived
类中的void func(double a)
函数,输出Derived::func(double)
。
- 对于
2. 代码修改
- 要使
callFunc(d, 5, 5.5);
能正确调用void func(int a, double b);
,需要添加一个匹配的callFunc
函数重载。 - 当前
callFunc
函数没有接受三个参数且符合类型要求的版本。 - 所以添加如下函数:
void callFunc(Derived& obj, int a, double b) {
obj.func(a, b);
}
这样从函数重载匹配规则角度,当调用callFunc(d, 5, 5.5);
时,就会调用这个新添加的callFunc
函数,进而调用Derived
类中的void func(int a, double b);
函数。