MST

星途 面试题库

面试题:C++函数模板类型参数兼容性之中等问题

请简述C++函数模板中,当类型参数为类类型时,其兼容性的规则。假设存在两个类A和B,B继承自A,在函数模板中使用这两个类作为类型参数,会出现哪些兼容性情况?举例说明。
36.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 兼容性规则
    • 在C++函数模板中,当类型参数为类类型时,类型参数之间不存在隐式类型转换。即使存在继承关系,函数模板不会自动将派生类对象当作基类对象来处理。
  2. 具体兼容性情况及示例
    • 参数不兼容情况
      • 假设有如下函数模板:
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*