面试题答案
一键面试- 实现思路:
- 由于
D
不是从C
继承而来,要使func
函数能接受C
和D
类型的对象,可以使用模板特化或者自定义类型转换。这里采用自定义类型转换的方式,在D
类中定义一个转换为C
类型的函数。这样在调用func
时,如果参数类型不匹配,编译器会尝试使用自定义类型转换来使参数类型一致。
- 由于
- 代码示例:
#include <iostream>
class C {
public:
int data;
C(int d) : data(d) {}
};
class D {
public:
int data;
D(int d) : data(d) {}
// 定义转换为C类型的函数
operator C() const {
return C(data);
}
};
template <typename T>
void func(T a, T b) {
std::cout << "a.data: " << a.data << ", b.data: " << b.data << std::endl;
}
int main() {
C c(10);
D d(20);
// 这里d会通过自定义类型转换为C类型
func(c, d);
return 0;
}
在上述代码中:
D
类定义了一个转换为C
类型的函数operator C()
。func
函数模板接受两个相同类型的参数。- 在
main
函数中,func(c, d)
调用时,d
会被自动转换为C
类型,从而满足func
函数模板的参数类型要求。