Ho gerarchia di interfacce pubbliche in questo modo:Le implementazioni di ereditarietà virtuale C++ di diversi compilatori non sono compatibili?
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 */ };
classe che implementa IFooBar è inserito nel dll con la funzione di fabbrica. Il codice client carica dll, usa la funzione factory per creare un'istanza di classe e usarla secondo le interfacce (vengono fornite come file di intestazione).
schema funziona bene con dll fatta da MSVC e il codice cliente da parte di Borland C++ Builder 6.
introduco eredità virtuale in gerarchia:
struct IFoo : public virtual ISwitchable { /* Methods */ };
struct IBar : public virtual ISwitchable { /* Methods */ };
E quando nella stessa situazione (DLL MSVC , client by Builder) codice client richiede istanza di classe che ottiene con vtable disordinato.
Esiste una soluzione ad eccezione del rollback sull'eredità ordinaria?
Non sono sicuro del motivo per cui è stato -1, sembra una domanda ragionevole. –
Come esattamente il vtable è incasinato? –
Non lo so, ma mi aspetto che MSVC e Borland C++ Builder differiscano nell'implementazione di tali elementi interni come la struttura di oggetti e vtable. Direi anche che è stata solo la fortuna che la versione non virtuale sta funzionando! Poiché lo standard C++ non definisce le esatte implementazioni ma solo il modo in cui C++ lavora per il programmatore è sul produttore di compilatori C++ per progettare le strutture di oggetti interne. – mmmmmmmm