如果我将指向派生类对象的派生类的指针static_cast指向基类的指针,然后取消引用该指针并将其作为方法参数传递,为什么基类类型的解除引用指针而不是派生类类型?它仍然指向派生类的对象,但是解引用的类型是base?
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);
}
}
答案 0 :(得分:0)
这是有效的,因为基类引用仍然可以引用派生类型对象的基本部分。
首先,*
中的*(Base *)x
可能会导致切片,但如果没有左值到右值的转换,它实际上不会切片,而不是结果直接绑定到引用。
同一原则的另一个例子是(Base &)der
。
NB。你的第一个函数不需要是一个模板:它可能只是一个接受EventHandler *
的常规函数。存在从派生到基类指针的隐式转换。