An abstract class is a protocol class if:
It neither contains nor inherits from classes that contain member data, non-virtual functions,
or private (or protected) members of any kind.
It has a non-inline virtual destructor defined with an empty implementation,
All member functions other than the destructor including inherited functions, are declared
pure virtual functions and left undefined.