当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++中使用模板函数实现的多态

    所谓模板函数(也有人叫函数模板)是这样一个概念:函数的内容有了,但函数的参数类型却是待定的(注意:参数个数不是待定的)。比如说一个(准确的说是一类或一群)函数带有两个参数,它的功能是返回其中的大值。这样的函数用模板函数来实现是适合不过的了。如下。
    template < typename T>
    T getMax(T arg1, T arg2)
    {
        return arg1 > arg2 ? arg1:arg2; //代码段1
    }
    这就是基于模板的多态吗?不是。因为现在我们不论是调用getMax(1, 2)还是调用getMax(3.0, 5.0)都是走的上面的函数定义。它没有根据调用时的上下文不同而执行不同的实现。所以这充其量也就是用了一个模板函数,和多态不沾边。怎样才能和多态沾上边呢?用模板特化呀!象这样:
    template<>
    char* getMax(char* arg1, char* arg2)
    {
        return (strcmp(arg1, arg2) > 0)?arg1:arg2;//代码段2
    }
    这样一来当我们调用getMax(“abc”, “efg”)的时候,就会执行代码段2,而不是代码段1。这样就是多态了。
    更有意思的是如果我们再写这样一个函数:
    char getMax(char arg1, char arg2)
    {
        return arg1>arg2?arg1:arg2; //代码段3
    }
    当我们调用getMax(‘a’, ‘b’)的时候,执行的会是代码段3,而不是代码段1或代码段2。C++允许对模板函数进行函数重载,就象这个模板函数是一个普通的函数一样。于是我们马上能想到写下面这样一个函数来做三个数中取大值的处理:
    int getMax( int arg1, int arg2, int arg3)
    {
        return getMax(arg1, max(arg2, arg3) ); //代码段4
    }
    同样我们还可以这样写:
    template <typename T>
    T getMax(T arg1, T arg2, T arg3)
    {
        return getMax(arg1, getMax(arg2, arg3) ); //代码段5
    }
    现在看到结合了模板的多态的威力了吧。比只用函数重载厉害多了。
相关内容
赞助商链接