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
実行結果:
クラステンプレートの派生
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;
}
実行結果: