tengo jerarquía de interfaces públicas como esto:¿Son incompatibles las implementaciones de herencia virtual C++ de los compiladores diferentes?
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 */ };
clase que implementa IFooBar se coloca en dll junto con la función de fábrica. El código de cliente carga dll, usa la función de fábrica para crear una instancia de clase y la usa según las interfaces (se suministran como un archivo de encabezado).
esquema funciona bien con dll hecha por MSVC y código de cliente realizado por Borland C++ Builder 6.
introduzco la herencia virtual en jerarquía:
struct IFoo : public virtual ISwitchable { /* Methods */ };
struct IBar : public virtual ISwitchable { /* Methods */ };
Y cuando en la misma situación (DLL MSVC , client by Builder) el código del cliente solicita una instancia de la clase que él obtiene con messy vtable.
¿Existe alguna solución, excepto la reversión a la herencia ordinaria?
No estoy seguro de por qué fue -1ed, parece una pregunta razonable. –
¿Cómo se estropea exactamente el vtable? –
No lo sé, pero espero que MSVC y Borland C++ Builder difieran en la implementación de elementos internos como vtable y estructura de objeto. ¡Incluso diría que fue una suerte que la versión no virtual esté funcionando! Como el estándar de C++ no define las implementaciones exactas, solo la forma en que C++ funciona para el programador es en el productor del compilador de C++ el que diseña las estructuras internas de los objetos. – mmmmmmmm