面试题答案
一键面试- 兼容性规则:
- 在C++函数模板中,当类型参数为类类型时,类型参数之间不存在隐式类型转换。即使存在继承关系,函数模板不会自动将派生类对象当作基类对象来处理。
- 具体兼容性情况及示例:
- 参数不兼容情况:
- 假设有如下函数模板:
- 参数不兼容情况:
template <typename T>
void func(T obj) {
// 函数体
}
- 定义类`A`和`B`:
class A {};
class B : public A {};
- 如果调用`func`函数模板,不能将派生类`B`对象传递给期望基类`A`对象的函数模板实例,如下代码会编译错误:
B b;
func<A>(b); // 编译错误,虽然B继承自A,但函数模板不会自动进行隐式转换
- 解决方法及兼容示例:
- 可以显式地将派生类对象转换为基类对象,如下:
B b;
A& a_ref = b;
func<A>(a_ref); // 正确,通过引用转换使参数类型匹配
- 或者,定义一个接受`A`指针的函数模板实例,并将`B`对象的指针传递给它(前提是进行合理的指针操作):
template <typename T>
void func(T* ptr) {
// 函数体
}
B b;
func<A>(&b); // 正确,B*可以隐式转换为A*