Шаг 110 - Шаблоны и универсальные классы

Помните в DAO мы связывали диалог с классом набором записей с помощью функций?

SetRecordset(m_pSet);
m_Book.SetRecordset(&cbookset);
m_Piple.SetRecordset(&cpipleset); 

В позапрошлом шаге мы связывали классы для работы так:

CMFCArray mfcArray;
CStlArray stlArray;
CWork cw1(&mfcArray);
CWork cw2(&stlArray);

С помощью шаблонов тоже можно связать классы. Давайте посмотрим, как это будет выглядеть на основе шаблонов.

#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"

class CVirtualBase
{
public:
	virtual CString GetClassName();		// получение имени класса
};

CString CVirtualBase::GetClassName()
{return "CVirtualBase";}

class CAdo : public CVirtualBase
{
public:
	CString GetClassName();
};

CString CAdo::GetClassName()
{return "CAdo";}

class CDao : public CVirtualBase
{
public:
	CString GetClassName();
};

CString CDao::GetClassName()
{return "CDao";}

class COdbc : public CVirtualBase
{
public:
	CString GetClassName();
};

CString COdbc::GetClassName()
{return "COdbc";}


template <class CVirtualBase > class CBaseClass 
{
public:
	CString GetClassName();
private:
	CVirtualBase cbaseclass;

};

template<class CVirtualBase>
CString CBaseClass<CVirtualBase>::GetClassName()
{return cbaseclass.GetClassName();}

void main()
{
	CBaseClass <CDao> cd;
	cout << cd.GetClassName() << endl; 
	CBaseClass <CAdo> ca;
	cout << ca.GetClassName() << endl; 
	CBaseClass <COdbc> co;
	cout << co.GetClassName() << endl; 
}

Однако у каждого способа есть достоинства и недостатки.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.07.2001