这是否正确使用了dynamic_cast?
问题描述:
我有三个类:Generic,CFG和Evaluator。这是否正确使用了dynamic_cast?
这里的通用:
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
的小类Evaluator
和CFG
。 Evaluator有一个名为LoadPlugins的方法,它的名字就是这么做的,通过方法Connect
将this
传递给DLL。那么,在第一种情况下,Connect中的Generic *
应该返回NULL
。但是,在第二种情况下,据我所知,应该返回一个有效的指针。这似乎不是以这种方式发生的。我错了吗?
答
dynamic_cast被称为突破与许多编译器(包括MSVC和gcc)模块边界。我不确切知道这是为什么,但用Google搜索会产生很多点击。我建议首先尝试摆脱dynamic_cast,而不是试图找出为什么它会在第二个场景中返回null。
原来我在编译DLL的时候忘了一些源文件。我按照你的建议做了,并抛出了将PluginLCD制作成DLL并将其硬编码到程序中的想法。无论如何,它不需要处于场景1中。 – Scott 2009-11-19 11:00:13