Est-ce bon usage de dynamic_cast?
-
21-09-2019 - |
Question
J'ai trois classes:. Générique, CFG et Evaluator
Voici générique:
class Generic: public virtual Evaluator, public CFG, public LCDInterface {
Voici CFG:
class CFG : public virtual Evaluator {
et sous Evaluator rien.
Je fournir une DLL nommée PluginLCD, et il a une méthode appelée Connect:
void PluginLCD::Connect(Evaluator *visitor) {
visitor_ = dynamic_cast<Generic *>(visitor);
if(!visitor_)
return;
type_ = visitor_->GetType();
}
Voilà comment je compiler la DLL par scons:
env.SharedLibrary(['PluginLCD.cpp', 'Evaluator.cpp', 'Generic.cpp', 'CFG.cpp'])
Maintenant, il y a deux scénarios dans mon code. L'un est en classe LCDControl
, qui sous-classes CFG
. L'autre scénario est au-dessus où Generic
et sous-classes Evaluator
CFG
. Évaluateur a une méthode appelée loadplugins, qui fait ce que son nom l'indique, en passant par this
à la DLL via la méthode Connect
. Eh bien, dans le premier scénario, le casting à Generic *
dans Connect devrait revenir NULL
. Cependant, dans le second scénario, pour autant que je sache, un pointeur valide doit être retourné. Il ne semble pas être le cas de cette façon. Ai-je tort à ce sujet?
La solution
dynamic_cast est connu pour briser à travers les frontières du module avec de nombreux compilateurs (y compris MSVC et gcc). Je ne sais pas exactement pourquoi c'est, mais googler il donne beaucoup de coups. Je recommande d'essayer de se débarrasser du dynamic_cast en premier lieu au lieu d'essayer de savoir pourquoi il renvoie null dans votre deuxième scénario.