کلاس های عمومی

تعریف یک کلاس جنریک بسیار شبیه به تعریف یک متد جنریک است. کلاس جنریک دارای یک علامت بزرگتر و کوچک‌تر و یک نوع پارامتر خاص می‌باشد. برنامه زیر مثالی از یک کلاس جنریک می‌باشد :

#include <iostream>
using namespace std;

template<class T>
class GenericClass
{
  private:
    T someField;

  public:
    GenericClass(T someVariable)
    {
      someField = someVariable;
    }

    T getSomeProperty()
    {
      return someField;
    }

    void setSomeProperty(T value)
    {
      someField = value;
    }
};

int main()
{
  GenericClass<double> genericDouble(30.50);
  GenericClass<int> genericInt(10);

  cout << "genericDouble.SomeProperty = " << genericDouble.getSomeProperty() << endl;
  cout << "genericInt.SomeProperty = " << genericInt.getSomeProperty() << endl;
}
genericDouble.SomeProperty = 30.50
genericInt.SomeProperty = 10

در مثال بالا یک کلاس جبریک که دارای یک فیلد، یک خاصیت و یک سازنده است را ایجاد می‌کنیم. تمام مکانهایی که ورودی T در آنها قرار دارد بعداً توسط انواعی که مد نظر شما است، جایگزین می‌شوند. وقتی یک نمونه از کلاس جنریک تان ایجاد می‌کنید، یک نوع هم برای آن در نظر بگیرید (<int>). مانند متدهای جنریک می‌توانید چندین نوع پارامتر به کلاسهای جنریک اختصاص دهید.

template<class T1,class T2, class T3>
class GenericClass
{
  private:
    T1 someField1;
    T2 someField2;
    T3 someField3;
};

کلاسهای جنریک می‌توانند از کلاسهای جنریک ارث بری کنند اما کلاس های فرزند اجازه داشتن ویژگی های کلاس های جنریک والد را ندارند:

template<class T1> class Parent
{
  //some code
};

template<class T> class Child: public Parent<T>
{
  //some code
};

کلاسهای غیر جنریک می‌توانند از کلاسهای جنریک ارث بری کنند، اما باید نوع آرگومان های کلاس جنریک باید در زمان ارث بری (در حین کدنویسی) به صورت زیر مشخص شوند:

class Child : public GenericClass<int>
{
  //some code
};

یک کلاس جنریک هم می‌تواند از یک کلاس غیر جنریک ارث بری کند.

template<class T> class Child: public Parent
{
  //some code
};