为什么C ++说不支持参数多态?

时间:2016-04-29 22:09:09

标签: c++ parametric-polymorphism

根据Parametric Polymorphism的维基百科页面:

  

类型多态的一些实现在表面上类似于参数多态,同时还引入了特殊方面。一个例子是C ++模板专业化。

问题:为什么C ++只表示实现与paramaterized多态相似的表面?特别是,模板不是完全参数多态的一个例子吗?

2 个答案:

答案 0 :(得分:1)

您链接的文章解释了这一点。你引用的文本实际上给出了一个例子,它将C ++的模板与纯参数多态性区分开来:C ++模板专业化。

继续这个主题:

  

在Christopher Strachey之后, [2] 参数多态可能与ad hoc polymorphism形成对比,其中单个多态函数可以具有许多不同且可能异构的实现,具体取决于类型应用它的参数。因此,ad hoc多态通常只能支持有限数量的此类不同类型,因为必须为每种类型提供单独的实现。

因此,如上所述,C ++模板接近 - 但并非完全 - 参数多态。

答案 1 :(得分:1)

  

为什么C ++只表示实现与参数化多态相似的表面形式?特别是,不是模板的完整参数多态的一个例子吗?

C ++中的模板化函数基于"替换"参数。这实质上意味着编译器生成另一个版本的函数,其中模板参数被硬编码到函数中。

假设你在C ++中有这个:

template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    int i = add(2, 3);
    double d = add(2.7, 3.8);
    return i + (int)d;
}

在编译期间,这将产生两个功能:int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; } 一个函数只能处理整数,另一个函数只能处理双精度数。没有多态性。

实际上,你最终会得到与参数变化数量一样多的实现。

&#34; 但为什么不是这种参数多态?&#34;你可能会问?

您需要添加&#39;的完整源代码。函数,为了用你自己的特定变量来调用它,这些变量会使二进制文件超载&#39; +&#39;运营商! - 那是 的细节。

如果C ++具有适当的参数多态性,例如C#,那么你的最终编译实现了&#39; add&#39;将包含足够的逻辑,以在运行时确定&#39; +&#39;过载将适用于“添加”可接受的任何给定参数。你不需要该函数的源代码,用你发明的新类型来调用它。

这在现实中意味着什么?

但是不要理解这就好像C ++功能不强或C#更强大。它只是众多语言功能细节中的一个。

如果你有完整的源代码可用于模板化函数,那么C ++的语义就要优越得多。如果您只有一个静态或动态库,那么参数化多态实现(例如C#)就更好了。