c – 什么是编译时多态,为什么它只适用于函数?

什么是编译时多态,为什么它只适用于函数?

解决方法:

回过头来,“编译时多态”意味着函数重载.它仅适用于函数,因为它们都可以超载.

在当前的C中,模板会改变它. Neil Butterworth已经举了一个例子.另一个使用模板专业化.例如:

#include <iostream>
#include <string>

template <class T>
struct my_template { 
    T foo;
    my_template() : foo(T()) {}
};

template <>
struct my_template<int> {
    enum { foo = 42 };
};

int main() { 
    my_template<int> x;
    my_template<long> y;
    my_template<std::string> z;
    std::cout << x.foo << "\n";
    std::cout << y.foo << "\n";
    std::cout << "\"" << z.foo << "\"";
    return 0;
}

这应该产生42,0和“”(一个空字符串) – 我们得到的结构对每种类型的行为都不同.

这里我们有类的“编译时多态”而不是函数.我想如果你想争论这一点,你可以声称这至少部分是构造函数(一个函数)至少在一种情况下的结果,但my_template的专用版本甚至没有构造函数.

编辑:至于为什么这是多态.我把“编译时多态”放在引号中是有原因的 – 它与普通的多态有些不同.尽管如此,我们得到的效果类似于我们对重载函数的期望:

int value(int x) { return 0; }
long value(long x) { return 42; }

std::cout << value(1);
std::cout << value(1L);

函数重载和特化给出了类似的效果.我同意,对于“多态”是否也适用于某些问题是开放的,但我认为它同样适用于另一个.

上一篇:java – 如果是父实例,instanceof会返回true吗?


下一篇:java – 如何使用多态而不是instanceof? (为什么?)