先敲一段代码先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,请指教