跳轉到內容

程式語言導論/引數多型性

來自華夏公益教科書,開放的書籍,為開放的世界

引數多型性

[編輯 | 編輯原始碼]

引數多型性是指當一個例程、型別或類定義由一個或多個型別引數化時發生的情況。它允許使用者選擇實際引數型別。這樣,就可以定義泛型的型別或函式,可以使用型別變數來表示引數型別。下面的程式碼展示了在 C++ 中實現引數多型性的方式,即使用 模板

#include <iostream>

template <class T>
T GetMax (T a, T b) {
  T result;
  result = (a > b) ? a : b;
  return (result);
}

int main() {
  int i = 5, j = 6, k;
  long l = 10, m = 5, n;
  k = GetMax<int>(i, j);       // type parameter: int
  n = GetMax<long>(l, m);      // type parameter: long
  std::cout << k << std::endl;
  std::cout << n << std::endl;
  return 0;
}

上面的原始碼定義了一個名為 GetMax 的多型函式(第 3 到 8 行)。在 GetMax 範圍內定義的型別變數 T 是一種泛型,它將在函式呼叫時被替換。該函式接受兩個引數 (ab),並返回一個型別為 T 的值。執行時 ab 的值會被比較,最大的值將被函式返回。主函式展示了對 GetMax 函式的兩個呼叫。在第 13 行,函式呼叫使用 int 型別,而在第 14 行,它使用 long 型別。在 GetMax 函式呼叫中,引數的內容使用 ">" 運算子進行比較。為了使用此函式,必須為變數型別實現此運算子。以下程式碼展示了在類 MyInt 中過載運算子 ">" 的實現,以便可以將 GetMax 應用於它。主函式展示了它的使用。

#include <iostream>
 
class MyInt {
  friend std::ostream & operator<<(std::ostream& os, const MyInt& m) {
    os << m.data;
  }
  friend bool operator >(MyInt& mi1, MyInt& mi2) {
    return mi1.data > mi2.data;
  }
  public:
    MyInt(int i) : data(i) {}
  private:
    const int data;
};

template <class T>
T GetMax (T a, T b) {
  return (a > b) ? a : b;
}

int main () {
  MyInt m1(50), m2(56);
  MyInt mi = GetMax<MyInt>(m1, m2);
  std::cout << mi << std::endl;
  return 0;
}

強制轉換 · 子型別多型性

華夏公益教科書