add pure virtual function