MST

星途 面试题库

面试题:C++模板类派生新类类型推导中的复杂场景

给定如下代码:`template <typename T1, typename T2> class Base { /*... */ }; template <typename T> class Middle : public Base<T, T*> { /*... */ }; class Final : public Middle<int> { /*... */ };`。请详细说明从`Final`类实例化开始,到所有相关模板类(`Base`和`Middle`)类型推导完成的整个过程。如果在`Base`类中定义了一个成员函数`void func(T1 param1, T2 param2);`,在`Final`类中如何正确调用这个函数?
34.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实例化过程

  1. Final类实例化:当实例化Final类时,由于Final继承自Middle<int>,这会触发Middle模板类的实例化。Middle模板类参数被确定为int,即Middle<int>被实例化。
  2. Middle模板类实例化Middle<int>实例化时,因为Middle继承自Base<T, T*>,此时T被确定为int,所以Base<int, int*>会被实例化。

调用Base类中的func函数

Final类中,可以通过以下方式调用Base类中的func函数:

class Final : public Middle<int> {
public:
    void callBaseFunc() {
        Base<int, int*>::func(0, (int*)nullptr);
    }
};

Final类的成员函数callBaseFunc中,使用Base<int, int*>::func来调用Base类中的func函数,并传递合适的参数。因为Base类是Final类的间接基类,所以需要通过限定名称的方式调用。如果Final类中有其他成员函数,可以类似地在这些成员函数中进行调用。如果在Final类的非成员函数中调用,需要先获取Final类的实例对象,然后通过对象来调用,例如:

void nonMemberCall() {
    Final f;
    f.Base<int, int*>::func(0, (int*)nullptr);
}