根据维基百科的参数多态性页面
一些类型多态性的实现表面上类似于参数多态性,同时也引入了一些特殊的方面。一个例子是C++模板专门化。
问题:,为什么说C++只实现一些表面上类似于参数化多态性的东西?特别是,模板不是参数多态的完整示例吗?
发布于 2016-04-30 01:29:09
为什么说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; }
--一个函数只处理ints,另一个只处理双重。没有多态性。
因此,实际上,您最终得到的实现与参数变化的数量一样多。
你可能会问:“,但为什么这不是参数多态性??”
你需要完整的源代码的'add‘函数,以便调用它与您自己的特殊变化的东西,重载二进制'+’操作符!-这是细节,使差异。
如果C++具有适当的参数多态(例如,C# ),那么'add‘的最终编译实现将包含足够的逻辑,以便在运行时确定“+”重载对于任何可接受的“添加”参数都是什么。你不需要这个函数的源代码,就可以用你发明的新类型来调用它。
,这在现实中意味着什么?
但是不要理解这一点,就好像C++没有那么强大,或者C#更强大。这只是许多语言特性细节之一。
如果您拥有模板化函数可用的完整源代码,那么C++的语义要好得多。如果您只有一个静态或动态库可供使用,那么参数多态实现(例如C#)就更好了。
https://stackoverflow.com/questions/36948205
复制相似问题