2015-12-03 313 views
-2

如果我static_cast指向派生類對象的指針指向基類指針,然後解引用該指針並將其作爲方法參數傳遞,爲什麼基類類型的解除引用指針而不是派生類型?它仍然指向派生類的對象,但取消引用的類型是基礎的?C++指向類的指針

template <typename T> 
inline void AttachEvent(EventID eventId, T* eventHandler) // the second paramater is a class derived from EventHandler 
{ 
     cout << eventHandler << endl; 
     static_assert(std::is_base_of<EventHandler, T>::value, "Class provided is not derived from EventHandler"); 

     EventManager* pEventManager = EventManager::GetSingletonPtr(); 
     assert(pEventManager); 
     if (pEventManager) 
     { 
      pEventManager->AttachEvent(eventId, *static_cast<EventHandler*>(eventHandler)); 
     } 
} 

void EventManager::AttachEvent(EventID eventId, EventHandler& eventHandler) 
{ 
    EventMapIterator result = m_eventMap.find(eventId); 
    assert(result != m_eventMap.end()); 
    if (result != m_eventMap.end()) 
    { 
     assert(result->second); 
     result->second->AttachListener(eventHandler); 
    } 
} 
+1

所以你問爲什麼演員確實要做它聲稱做的? – Adam

+0

噢,它會轉換它指向的指針和對象嗎? –

+1

顯示代碼示例並解釋爲什麼您認爲其可觀察行爲是違反直覺的。 –

回答

0

這是可行的,因爲基類引用仍然可以引用派生類型的對象的基本部分。

起初看起來好像在*(Base *)x導致一個切片,但它實際上不切片,如果沒有左值到右值轉換,當結果直接綁定到參考。

同樣原理的另一個例子是(Base &)der

注意:你的第一個功能不需要是一個模板:它可能只是一個接受EventHandler *的常規功能。有從派生到基類指針的隱式轉換。