C++模板類繼承

2020-07-16 10:04:44
繼承可以應用於類別範本。例如,在以下模板中,SearchableVector 類就是從 SimpleVector 類派生的:
//SearchVect.h 的內容
#include "IntRange.h"
template <class T>
class SearchableVector : public SimpleVector<T>
{
    public:
        // Constructor.
        SearchableVector(int s) : SimpleVector<T>(s)
        { }
        // Copy constructor.
        SearchableVector(const SearchableVector &);
        // Additional constructor.
        SearchableVector(const SimpleVector<T>&obj): SimpleVector<T>(obj) { }
        int findItem(T);
};
template <class T>
SearchableVector<T>::SearchableVector(const SearchableVector &obj): SimpleVector<T>(obj)
{

}

template <class T>
int SearchableVector<T>::findItem(T item)
{
    for (int count = 0; count < this->size (); count++)
    {
        if (this->operator[] (count) == item)
            return count;
    }
    return -1;
}

提示,這裡不再給出 SimpleVector.h 的程式碼,該程式碼可從《C++類別模板用法》一節中獲取。

現在使用該範例來仔細看一看從模板基礎類別派生一個類的方法。首先,必須向編譯器指出,我們正在基於另一個己經存在的類別範本定義一個新的類別範本,語句如下:
template<class T>
class SearchableVector : public SimpleVector<T>
{
    //類的成員寫在此處
};
這裡新定義的類別範本是 SearchableVector,而現有的基礎類別模板是 SimpleVector <T>。該類有 3 個建構函式。以下顯示的是第一個建構函式:

SearchableVector(int size) : SimpleVector<T>(size){ }

該建構函式被設計為動態分配一個T型別的 size 個元素的陣列,它通過呼叫基礎類別建構函式並給它傳遞形參 size 來完成。此建構函式將建立一個指定大小的陣列,並將所有元素初始化為 T 型別的預設值。該類還有另一個建構函式如下:

SearchableVector(SimpleVector<T>&obj): SimpleVector<T>(obj){ }

它釆用一個基礎類別物件作為形參,其副本將被搜尋。建構函式只是將其形參傳遞給基礎類別複製建構函式。剩餘的一個建構函式是 SearchableVector 類的複製建構函式,如下所示:

SearchableVector(SearchableVector<T>&obj): SimpleVector<T>(obj){ }

由於 SearchableVector 的初始化與 SimpleVector 的初始化相同,所以 SearchableVector 複製建構函式只是將其引數傳遞給它的基礎類別的複製建構函式。成員函數 findItem 釆用一個型別 T 的專案作為引數,並返回該專案在陣列中的位置。如果在陣列中找不到該專案,則返回值 -1。

下面程式演示了該類的用法。它將值儲存到兩個 SearchableVector 物件中,然後在每個物件中搜尋一個特定值。
//This program demonstrates the SearchableVector template.
#include <iostream>
#include "searchvect.h"

using namespace std;
int main()
{
    const int SIZE = 10;
    SearchableVector<int> intTable (SIZE);
    SearchableVector<double> doubleTable(SIZE);
    // Store values in the vectors
    for (int x = 0; x < SIZE; x++)
    {
        intTable[x] = (x * 2);
        doubleTable[x] = (x * 2.14);
    }
    // Display the values in the vectors
    cout << "These values are in intTable:n";
    for (int x = 0; x < SIZE; x++)
        cout << intTable[x] << " ";
    cout << endl;
    cout << "These values are in doubleTable:n";
    for (int x = 0; x < SIZE; x++)
        cout << doubleTable[x] << " ";
    cout << endl;
    // Now search for values in the vectors
    int result;
    cout << "Searching for 6 in intTable.n";
    result = intTable.findItem(6);
    if (result == -1)
        cout << "6 was not found in intTable. n";
    else
        cout << "6 was found at subscript " << result << endl;
    cout << "Searching for 12.84 in doubleTable.n";
    result = doubleTable.findItem(12.84);
    if (result == -1)
        cout << "12.84 was not found in doubleTable.n";
    else
        cout << "12.84 was found at subscript " << result << endl;
    return 0;
}
程式輸出結果:

These values are in intTable:
0 2 4 6 8 10 12 14 16 18
These values are in doubleTable
0 2.14 4.28 6.42 8.56 10.7 12.84 14.98 17.12 19.26
Searching :for 6 in intTable.
6 was found at subscript.3
Searching for 12.84 in doubleTable.
12.84 was found at subscript 6

SearchableVector 類說明了可以從一個類別範本派生出另一個類別範本。另外,類別範本可以從普通類派生,而普通類也可以從類別範本派生。