这是否正确使用了dynamic_cast?

时间:2009-11-19 10:40:06

标签: c++ dynamic-cast

我有三个类:Generic,CFG和Evaluator。

这是Generic:

class Generic: public virtual Evaluator, public CFG, public LCDInterface {

这是CFG:

class CFG : public virtual Evaluator {

评估员没有任何子类。

我提供了一个名为PluginLCD的DLL,它有一个名为Connect的方法:

void PluginLCD::Connect(Evaluator *visitor) {
    visitor_ = dynamic_cast<Generic *>(visitor);
    if(!visitor_)
        return;
    type_ = visitor_->GetType();
}

以下是我通过scons编译DLL的方法:

env.SharedLibrary(['PluginLCD.cpp', 'Evaluator.cpp', 'Generic.cpp', 'CFG.cpp'])

现在,我的代码中有两种情况。一个在类LCDControl中,其子类为CFG。另一种情况高于Generic子类EvaluatorCFG。 Evaluator有一个名为LoadPlugins的方法,它的名字就是这样做的,它通过方法thisConnect传递给DLL。好吧,在第一个场景中,Connect中Generic *的强制转换应返回NULL。但是,在第二种情况下,据我所知,应该返回一个有效的指针。它似乎没有以这种方式发生。我错了吗?

1 个答案:

答案 0 :(得分:2)

众所周知,dynamic_cast会与许多编译器(包括MSVC和gcc)跨越模块边界。我不确切地知道为什么会这样,但谷歌搜索它会产生许多命中。我建议首先尝试摆脱dynamic_cast,而不是试图找出它在第二种情况下返回null的原因。