为什么C++被认为不支持参数多态性?

11
根据参数化多态性的维基百科页面:

某些类型多态性的实现与参数多态性表面上相似,同时也引入了特定方面。其中一个例子是C++模板专业化。

问题:C++为什么被认为只实现了类似于参数化多态性的东西?特别是,难道模板不是完全的参数化多态性的例子吗?

无论这个问题的答案如何,那个维基百科页面都需要大量的关注和爱心... - Barry
1
那个维基页面是从理论角度来看的 - 对类型理论进行严格的数学规范,因此,“参数多态性”一词有一个严格的定义。C++模板比任何这样的理论更灵活...因此...也许更有用!当然更加有趣!无论如何,我总是听说C++模板被描述为“特别多态性”。 - davidbak
2个回答

2
您提供的链接文章解释了这一点。您引用的文本实际上给出了一个例子,说明了C ++模板与纯参数多态性的区别:C ++模板特化。
它继续探讨了这个主题:
根据Christopher Strachey[2]的说法,参数多态性可以与临时多态性相对比较,其中单个多态函数可以有许多不同的、可能是异构的实现,具体取决于应用于其参数的类型。因此,临时多态性通常只能支持有限数量的这种不同类型,因为必须为每种类型提供单独的实现。
因此,正如所描述的那样,C++模板接近于——但并非完全符合——参数多态性。

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; }一个函数仅处理整数,另一个函数仅处理双精度浮点数,没有多态性。
因此,你最终将得到与参数变化数量相同的实现。
但为什么这不是参数多态性呢?”你可能会问。
你需要完整的“add”函数源代码,才能用自己特定的重载二进制“+”运算符的变体来调用它!这就是使其不同的细节。
如果C++具有像C#那样的适当的参数多态性,那么你最终编译的“add”实现将包含足够的逻辑来在运行时确定对于任何可接受的“add”参数,“+”重载将是什么。而且你不需要该函数的源代码,就可以使用新类型来调用它。

这在现实中意味着什么?

但不要把这理解为C++不够强大或C#更加强大。这只是许多语言特性中的一个细节。
如果您可以获取所需模板函数的全部源代码,则C ++的语义要优于其他语言。如果您只有静态或动态库可用,则参数多态实现(例如C#)更好。

我不同意。它仍然是多态性:它具有相同的名称和不同的内部形式。这就是多态性的翻译。无论是在编译时还是在运行时完成都是无关紧要的。 - Palo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接