virtual ctor