None of those things are required for a class. I'll admit they are all useful at time, but all are abused.
You can also have implement different associated functions based on properties of generic arguments, which is quite different in design from just attaching methods to a struct.