add virtfunc