need virtual dtor when delete derived by base pointer