 <p>In <code>Event* EventHandler::DequeueEvent()</code> you have line <code>Event* result = new Event(*this-&gt;_eventQueue.front());</code> Here the slicing occurs. You can do the following:</p> <pre><code>class Event { public: virtual Event* clone() { // create a new instance and copy all the fields } </code></pre> <p>}</p> <p>Then override <code>clone()</code> in derived classes, e.g. </p> <pre><code>class KeyboardKeyEvent :public Event { public: ... virtual KeyboardKeyEvent* clone(); // note - it returns different type } </code></pre> <p>Then change <code>Event* EventHandler::DequeueEvent()</code> : <code>Event* result = (*this-&gt;_eventQueue.front()).clone();</code></p>