add virtual-function