У меня есть иерархия открытых интерфейсов, как это:
struct ISwitchable {
/* Obtain pointer to another implemented interface of the same instance. */
virtual int switch(unsigned int interfaceId, void** pInstance) = 0;
};
struct IFoo : public ISwitchable { /* Methods */ };
struct IBar : public ISwitchable { /* Methods */ };
struct IFooBar : public IFoo, public IBar { /* Methods */ };
Класс, реализующий IFooBar, помещается в dll вместе с заводской функцией. Клиентский код загружает dll, использует фабричную функцию для создания экземпляра класса и использования его в соответствии с интерфейсами (они поставляются в виде заголовочного файла).
Схема отлично работает с DLL, созданной MSVC, и клиентским кодом, созданным Borland C ++ Builder 6.
Я ввожу виртуальное наследование в иерархию:
struct IFoo : public virtual ISwitchable { /* Methods */ };
struct IBar : public virtual ISwitchable { /* Methods */ };
И когда в той же ситуации (dll от MSVC, клиент от Builder) клиентский код запрашивает экземпляр класса, он получает его с грязным vtable.
Есть ли какое-либо решение, кроме возврата к обычному наследованию?