2015-12-03 4 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 вызывает срез, но это на самом деле не порезать, если нет именующих к Rvalue преобразования, который есть не тогда, когда результат напрямую связан с ссылкой ,

Другим примером такого же принципа будет (Base &)der.

NB. Ваша первая функция не обязательно должна быть шаблоном: это может быть просто регулярная функция, принимающая EventHandler *. Существует неявное преобразование из указателя на базовый класс.

Смежные вопросы