1) An interface defines a namespace. This allows me to create my own interfaces that have function names that would otherwise clash with the OS ones. IKarl->AllocVec() is totally different from IExec->AllocVec(). Both can happily coexist in the same source.
This doesnt work for libraries which are ported from link libraries. For example I cant imagine you edit every single SDL port to call SDLIFace->SetVideoMode() instead of SetVideoMode() ?
As a more tangible example, consider MUI/Reaction etc. The BOOPSI calling mechanism is just awful. Reimplementing them using interfaces would likely give more compact code that could run a hell of a lot faster. I am sure a button->DoLayout() is an order of magnitude faster than a DoMethod() call via the boopsi dispatcher
How inheritance would work? For example if you subclass root class and ad your own methods -- how root class is supposed to handle them?
On the other hand you need a class pointer to call super class. On the other hand you must access your local object data somehow. In practise you are trying to create a class from library base.
If you look into OS4 documentation you will find out interface has
a) function table at positive offset
b) data at negative offset
AmigaOS 3 library base has
a) function table at negative offset
b) data at positive offset
That is major difference between them.