It can help if you properly established the relationship between Event, DerivedEvent and NewDerivedEvent. I'm going to assume that DerivedEvent and NewDerivedEvent are derived from Event, but are otherwise not related, and that newEv points to a DerivedEvent object. In that case, this results in undefined behaviour:
Code:
ve = static_cast<NewDerivedEvent*>(newEv);
On the other hand, if newEv points to a NewDerivedEvent, then your reasoning does not hold: ve has the type NewDerivedEvent*, and it points to a NewDerivedEvent object. The static_cast works.
If you are not certain as to what is the actual type of the object pointed to, then manasij7479's suggestion of dynamic_cast is a correct approach. However, before you reach for dynamic_cast: why do you need to treat the object as a NewDerivedEvent object instead of an Event object? Can you not design the Event interface such that you can just operate using that here?
By the way, this looks wrong:
Code:
Event* newEv = new NewDerivedEvent;
newEv = m_EventHolder->Poll();
You use new to create a NewDerivedEvent object, and set newEv to point to it, but immediately afterwards, you overwrite newEv such that you can no longer use delete to destroy the NewDerivedEvent object previously created.