c ++指向类的指针

时间:2015-12-03 06:31:26

标签: c++ pointers inheritance

如果我将指向派生类对象的派生类的指针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);
    }
}

1 个答案:

答案 0 :(得分:0)

这是有效的,因为基类引用仍然可以引用派生类型对象的基本部分。

首先,*中的*(Base *)x可能会导致切片,但如果没有左值到右值的转换,它实际上不会切片,而不是结果直接绑定到引用。

同一原则的另一个例子是(Base &)der

NB。你的第一个函数不需要是一个模板:它可能只是一个接受EventHandler *的常规函数​​。存在从派生到基类指针的隐式转换。