Помните в 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;
}
Однако у каждого способа есть достоинства и недостатки.