派生类中非模板方法的模板方法

mnn*_*mnn 3 c++ templates class derived

class A {
public:
    template<typename T> void func(size_t n, T values[]) { ... }
};

class B : public A {
public:
    void func(size_t n, uint32_t values[]) { ... }
};
Run Code Online (Sandbox Code Playgroud)

调用此代码时,为什么函数B::func() 优先于函数模板A::func()

uint32_t values[5];
A* obj = new B();
obj->func(5, values);
Run Code Online (Sandbox Code Playgroud)

tem*_*def 6

两个原因 -

  1. 在C++中,如果基类函数标记为虚拟,则成员函数仅覆盖基类成员函数.否则,C++将两者视为巧合具有相同名称的独立函数.这与Java形成对比,Java中的函数自动覆盖基类函数.

  2. 在C++中,模板成员函数不能标记为虚拟.这部分是由于最常用的虚函数的实现 - vtables - 与C++模板实例化系统相结合.C++将不同类型参数的同一模板的所有实例化视为单独的函数,并且懒惰地生成这些实例化.这是vtable实现的一个问题,因为vtable需要静态编译时确定类中不同虚函数的数量,以及对它们的排序.由于模板虚函数意味着类中未知的数字和虚函数的排序,C++不允许这样做.