首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >派生类中的模板方法优于非模板方法

派生类中的模板方法优于非模板方法
EN

Stack Overflow用户
提问于 2011-01-01 19:54:52
回答 4查看 1K关注 0票数 3
代码语言:javascript
复制
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[]) { ... }
};

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

代码语言:javascript
复制
uint32_t values[5];
A* obj = new B();
obj->func(5, values);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-01 20:08:10

有两个原因-

  1. In C++成员函数仅在基类函数标记为虚拟时重写基类成员函数。否则,C++将这两个函数看作是巧合地具有相同名称的独立函数。与Java形成对比的是,函数原子化地覆盖基类函数。
  2. 在C++中,模板成员函数不能标记为虚拟。这部分是由于实现了最常用的虚拟函数-- vtables -与C++模板实例化系统相结合。C++将同一模板在不同类型参数上的所有实例化视为单独的函数,并延迟地生成这些实例化。这是vtable实现的一个问题,因为vtable需要静态地、编译时确定类中不同虚拟函数的数量,并对它们进行排序。由于模板虚拟函数意味着类中虚拟函数的数目和顺序未知,因此C++不允许这样做.
票数 6
EN

Stack Overflow用户

发布于 2011-01-01 20:05:04

如果您对类型为A的对象/指针/引用调用A,则会调用A::func,因为func不是虚拟的(而不是:它是一个模板函数)。

你真的测试了你的代码吗?

票数 1
EN

Stack Overflow用户

发布于 2011-01-01 20:04:37

A::func()没有声明为virtual,所以编译器不会生成在运行时调用B::func()所需的虚拟表和任何其他代码。它与模板无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4575491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档