add virtual functions