use virtual inheritance