Sure, but the interface never changes.  The constructor of the abstract base class could take a "QHash<int, QByteArray> roles" parameter, which is used to initialise a (protected maybe) m_roleNames variable, and the base class implementation of roleNames() just returns that.

If possible, we should keep the API which derived classes have to implement, to a minimum.

But, anyway, don't worry about it for now, I guess - as it's something which can easily be done later anyway.