问一个模板类的有关问题,请进
问一个模板类的问题,请进
先敲一段代码先
class CA:public CTreeView,CAExt <int>
{
void CTestView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeViewExt <int> ::OnInitialUpdate();
}
LONG CTestView::OnDataAvailable(WPARAM wParam, LPARAM lParam)
{
return CTreeViewExt <int> ::OnDataAvailable(wParam, lParam);
}
//以下三个函数的具体实现过程省略
CTreeCtrl& GetTreeCtrl() const { return CTreeView::GetTreeCtrl(); }
virtual void GetRootItems(list <TreeData> & List);
virtual void GetChildItems(list <TreeData> ::iterator it, list <TreeData> & List);
}
template <class T>
class CAExt
{
static UINT InitialThreadProc(LPVOID pData)
{
ASSERT(pData!=NULL);
CTreeViewExt* pThis = static_cast <CTreeViewExt*> (pData);
ASSERT(pThis!=NULL);
return pThis-> ThreadProc();
}
OnInitialUpdate()
{
AfxBeginThread(InitialThreadProc, (LPVOID)this,THREAD_PRIORITY_LOWEST);
}
//以下是三个纯虚函数
virtual void GetRootItems(list <TreeData> & List) = 0;
virtual void GetChildItems(list <TreeData> ::iterator it, list <TreeData> & List) = 0;
virtual CTreeCtrl& GetTreeCtrl() const = 0;
//下面两个函数的具体过程省略
ThreadProc()
{
//这里调用了GetRootItems,GetChildItems,GetTreeCtrl
}
OnDataAvailable()
{
//这里调用了GetRootItems,GetChildItems,GetTreeCtrl
}
}
我想问的是
1.CTreeViewExt* pThis = static_cast <CTreeViewExt*> (pData);里的pData,也就是this,指向的是CA还是CAExt
2.ThreadProc和OnDataAvailable怎么可以调用GetRootItems,GetChildItems,GetTreeCtrl,他们不是都是纯虚函数么,还是因为它们都是调用CA里的GetRootItems,GetChildItems,GetTreeCtrl,请指教
------解决方案--------------------
1。既然是指针,指向CA和CAExt没有区别。起始地址是一样的。
2。纯虚函数,自动调用子类的函数。
先敲一段代码先
class CA:public CTreeView,CAExt <int>
{
void CTestView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeViewExt <int> ::OnInitialUpdate();
}
LONG CTestView::OnDataAvailable(WPARAM wParam, LPARAM lParam)
{
return CTreeViewExt <int> ::OnDataAvailable(wParam, lParam);
}
//以下三个函数的具体实现过程省略
CTreeCtrl& GetTreeCtrl() const { return CTreeView::GetTreeCtrl(); }
virtual void GetRootItems(list <TreeData> & List);
virtual void GetChildItems(list <TreeData> ::iterator it, list <TreeData> & List);
}
template <class T>
class CAExt
{
static UINT InitialThreadProc(LPVOID pData)
{
ASSERT(pData!=NULL);
CTreeViewExt* pThis = static_cast <CTreeViewExt*> (pData);
ASSERT(pThis!=NULL);
return pThis-> ThreadProc();
}
OnInitialUpdate()
{
AfxBeginThread(InitialThreadProc, (LPVOID)this,THREAD_PRIORITY_LOWEST);
}
//以下是三个纯虚函数
virtual void GetRootItems(list <TreeData> & List) = 0;
virtual void GetChildItems(list <TreeData> ::iterator it, list <TreeData> & List) = 0;
virtual CTreeCtrl& GetTreeCtrl() const = 0;
//下面两个函数的具体过程省略
ThreadProc()
{
//这里调用了GetRootItems,GetChildItems,GetTreeCtrl
}
OnDataAvailable()
{
//这里调用了GetRootItems,GetChildItems,GetTreeCtrl
}
}
我想问的是
1.CTreeViewExt* pThis = static_cast <CTreeViewExt*> (pData);里的pData,也就是this,指向的是CA还是CAExt
2.ThreadProc和OnDataAvailable怎么可以调用GetRootItems,GetChildItems,GetTreeCtrl,他们不是都是纯虚函数么,还是因为它们都是调用CA里的GetRootItems,GetChildItems,GetTreeCtrl,请指教
------解决方案--------------------
1。既然是指针,指向CA和CAExt没有区别。起始地址是一样的。
2。纯虚函数,自动调用子类的函数。