virtual dtor for downcasting