no need for virtual funcs