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