I like the idea of Haiku OS, but from what I've heard, for binary-compatibility reasons (kernel drivers? All applications? I'm not sure) it still ships with GCC 2.95. Requiring a compiler over a decade old for a modern OS doesn't seem like a good long-term strategy.
IIRC one of the reasons Apple passed on BeOS was that the lack of a stable C++ ABI made app dependencies on the OS classes very fragile. For example, API classes had to be padded out with dummy members to make room for later non-breaking additions to apps. Is this still a problem? Isn't this why just about every other OS exposes it's lowest level APIs as C apis?
E.g.: http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/io... - note the
ExpansionData * reserved;
member variable and the block of private:
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 0);
#ifdef __LP64__
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 1);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 2);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 3);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 4);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 5);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 6);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 7);
#else /* !__LP64__ */
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 1);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 2);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 3);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 4);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 5);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 6);
OSMetaClassDeclareReservedUsed(IOMemoryDescriptor, 7);
#endif /* !__LP64__ */
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 8);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 9);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 10);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 11);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 12);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 13);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 14);
OSMetaClassDeclareReservedUnused(IOMemoryDescriptor, 15);
dummy methods.There is also a system in place for the linker to patch the vtables of dynamically loaded classes (i.e. third-party drivers). They've also built an Objective-C-like Class/metaclass system in C++ via macros for I/O Kit, for some very basic reflection (mainly to keep track of whether instances of a class exist, and if not, unloading the kernel module).