If BaseEventPtr is a smart pointer, it should be fine.
Basically, a generic pointer calls delete on a real pointer when there are no more links. If the base class has a virtual destructor , delete invokes the corresponding subclass destructor.
For instance:
class NonVirtualBase {}; class NonVirtualSubclass: public NonVirtualBase {}; shared_ptr<NonVirtualBase> ptr( new NonVirtualSubclass() ); // NOT OK! class VirtualBase { virtual ~VirtualBase() {} }; class VirtualSubclass: public VirtualBase {}; shared_ptr<VirtualBase> ptr( new VirtualSubclass() ); // OK
This also applies to regular (bare) pointers. That is why, as a rule, if a class can serve as a base class in the future, it must be defined with a virtual destructor (even if empty).
source share