[MFC] Este necesar RTTI (Run-Time Type Information) in MFC?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Este necesar RTTI (Run-Time Type Information) in MFC?

Post by Ovidiu Cucu » 09 Aug 2011, 10:16

Intrebare
Este necesar mecanismul C++ de identificare a tipului (aka RTTI), folosind type_info, typeid si dynamic_cast atunci cand scriem extensii MFC?

Raspuns
Nu, in general nu este necesar.
MFC-ul are propriul sau mecanism de indentificare a tipului pentru obiecte din clase derivate din CObject.
In plus, exista cazuri in care RTTI nu poate fi aplicat. Un caz frecvent intalnit este atunci cand avem de tratat mesaje Windows care primesc un pointer in lParam sau avem de-a face cu un pointer la un obiect storat in membrul lParam al unei structuri definite in Windows SDK (destinat sa tina user-data).

In exemplul urmator, se asteapta in membrul lParam al structurii LVITEM primita prin mesajul LVM_INSERTITEM, un pointer la un obiect tip SItemData derivat din CObject.
Exemplu

Code: Select all

class SItemData : public CObject 
{
   DECLARE_DYNAMIC(SItemData)
   // ...
};

Code: Select all

LRESULT CCustomListView::OnSetItem(WPARAM wParam, LPARAM lParam)
{
   SItemData* pItemData = (SItemData*)((LPLVITEM)lParam)->lParam; 
   ASSERT_KINDOF(SItemData, pItemData); // Not a valid SItemData
   // ...do stuff.
   return Default();
}
Verificarea se face folosind macro-ul ASSERT_KINDOF care la randul lui cheama CObject::IsKindOf.
Acceeasi verificare nu este posibila cu RTTI deoarece lParam este de tipul 'LPARAM', sinonim cu 'long'.

Vezi si
<< Back to MFC index



Post Reply