dynamic_cast renvoie NULL mais ne devrait pas

J’ai la hiérarchie de classe suivante:

class IStorage { [...] } Q_DECLARE_INTERFACE(IStorage, "ch.gorrion.smssender.IStorage/1.0") class ISQLiteStorage: public IStorage { Q_INTERFACES(IStorage) [...] } Q_DECLARE_INTERFACE(ISQLiteStorage, "ch.gorrion.smssender.ISQLiteStorage/1.0") class DASQLiteStorage: public QObject, public ISQLiteStorage { Q_OBJECT Q_INTERFACES(ISQLiteStorage) [...] } 

J’utilise QT et j’essaie de créer un plugin (pour mon application) avec QtPlugin. Je crée une instance de DASQLiteStorage et je donne cette instance à un object FROM WITHIN du plugin:

 // the next line is within my main app. // storage is the DASQLiteStorage instance. // gateway is an object from within the plugin. gateway->setDefaultStorage(storage); // this method lies within the plugin void AbstractGateway::setDefaultStorage(IStorage* storage) { defaultStorage_ = dynamic_cast(storage); } 

Le problème, c’est que dynamic_cast me renvoie un pointeur null (non attendu), alors que dynamic_cast est utilisé dans mon application principale (c’est-à-dire avant que “gateway-> setDefaultStorage (storage);”) me donne le pointeur valide (attendu).

Est-ce que quelqu’un sait pourquoi cela pourrait arriver? Le programme fonctionne-t-il dans une plage de mémoire différente de celle du plug-in? Cela pourrait-il conduire à de tels problèmes? Une idée de comment réparer ça?

Merci beaucoup!

EDIT: J’ai essayé quelques suggestions:

 // this method lies within the plugin void AbstractGateway::setDefaultStorage(IStorage* storage) { ISQLiteStorage* s = dynamic_cast(storage); s = static_cast(storage); s = qobject_cast((QObject*)storage); defaultStorage_ = s; } 

Dans la première ligne de la méthode, s est égal à NULL, dans la seconde, s contient le pointeur correct et dans la troisième, un autre pointeur. Pourquoi ces pointeurs ne sont-ils pas égaux?
Et pourquoi le dynamic_cast ne fonctionnerait-il toujours pas alors que j’utilise maintenant:

 pluginLoader()->setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint); 

EDIT2: J’ai remarqué que la faute de segmentation que je vais un peu plus loin dans le code est également liée à cela. J’ai la construction suivante:

 // The following classes are defined within the main app. class ILoginAccount: public IAccount [...] class AbstractAccountStroageOfficer { public: AbstractAccountStroageOfficer(IAccount* account)[...] } // These classes are defined within my plugin and are created from within the plugin. class BCAccount: public ILoginAccount { public: BCAccount() : ILoginAccount(new DAAccountStorageOfficer(this)) {}; } class DAAccountStorageOfficer: public AbstractAccountStorageOfficer { public: DAAccountStorageOfficer(ILoginAccount* account) : AbstractAccountStorageOfficer(account) // This line raises a segfault. { IAccount* a = account; // This line raises a segfault as well. a = dynamic_cast(account); // This as well. a = static_cast(account); // This as well. } } 

Ces erreurs de segmentation ne devraient pas se produire, devraient-elles? Mais pourquoi font-ils?

Fondamentalement, RTTI n’est pas fiable au-delà des limites des modules. Différents compilateurs ont des comportements différents ici; vous devrez rechercher comment votre compilateur / version agit dans ce cas. Bien sûr, si vous avez un compilateur / une version différente pour l’application principale et le plugin, cela n’a clairement aucune chance de fonctionner.

Utilisez static_cast comme solution de contournement.