C++__クラステンプレートの派生


基礎知識:
クラステンプレートの派生
1)通常クラス派生クラステンプレート2)クラステンプレートはクラステンプレートを派生することもできますが、この場合、派生クラステンプレートのパラメータテーブルにはベースクラステンプレートのパラメータが含まれている必要があります.3)テンプレートクラスは通常クラスと同様に多重継承があり,すなわちテンプレートクラス間で多重継承が許容される.
クラステンプレートから新しいクラスを派生できます.クラステンプレートも非テンプレートクラスも派生できます.派生メソッド:
⑴クラステンプレートから派生するクラステンプレートは、次の例のように、クラステンプレートから新しいクラステンプレートを派生することができる.
template
class base
{
……
};
 
template
class derive:public base
{
……
};
一般的なクラス派生定義と似ていますが、ベースクラスを指摘するときにテンプレートパラメータ、すなわちbaseを付けます.
(2)クラステンプレートから非テンプレートクラスを派生させるには、クラステンプレートから非テンプレートクラスを派生させることができ、派生では、非テンプレートクラスのベースクラスとしてクラステンプレートがインスタンス化されたテンプレートクラスである必要があり、派生クラスを定義する前にテンプレート宣言文:templateは必要ありません.例:
template
class base
{
……
};
 
class derive:public base
{
……
};
deriveクラスを定義すると、baseはint型のテンプレートクラスにインスタンス化されます.

カスタムインプリメンテーションのStackと継承のDeque
#include <iostream>
using namespace std;

#include <iostream>
#include <exception>
using namespace std;

template<typename T>
class Stack
{
protected:
	T* pStack;
	int _size;
	int _top;	//top 0,      .
public:
	Stack(int _size) :_top(0)
	{
		pStack = new T[_size];
	}

	Stack() :_top(0), _size(20)
	{
		pStack = new T[_size];
	}

	void push(const T element)
	{
		pStack[++_top] = element;
	}

	T pop()throw (out_of_range)
	{
		if (0 == _top)
			throw out_of_range("Stack is empty");
		else
			return pStack[_top--];
	}

	T& top()
	{
		return pStack[_top];
	}
	virtual ~Stack()
	{
		delete[] pStack;
	}
};


template<typename T>
class Deque : public Stack<T>{
protected:
	int _tail;
public:
	Deque() :_tail(0), Stack(){}
	Deque(int size) :_tail(0), Stack(size){}
	T& getFirst()
	{
		return Stack::top();
	}
	T& getLast()
	{
		return pStack[_tail];
	}
};

int main(){

	try
	{
		Stack<int> intStack(20);
		intStack.push(7);
		intStack.top() += 5;
		cout << intStack.top() << endl;
		cout << intStack.pop() << endl;
		cout << intStack.pop() << endl;
	}
	catch (exception &e)
	{
		cout << e.what() << endl;
	}

	try
	{
		Deque<int> intDeque(20);
		intDeque.push(2);
		intDeque.getFirst() += 8;
		cout << intDeque.getFirst() << endl;
	}
	catch (exception &e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

実行結果: