Given OOP, the only ABI for an object is a vtable and that is left unspecified (for good reason) by the C++ standard.
COM said, "objects are cool and modules are cool so we need an ABI for objects" and specified a vtable. It isn't the only programming model which continued from the same observation: Python did too with its absolutely abysmal leaky PyObject ABI
SOM predates COM, and is even cooler, as it supported class inheritance, metaclasses and Smalltalk as target language.
On OS/2, Smalltalk enjoyed a role similar to what would be .NET and VB on Windows.
Sure you can use delegation with aggregation, and type libraries (nowadays .NET metadata), but still isn't as ergonomic.