我发现这dynamic_cast
在我期望的情况下不起作用,并且typeid
在运行时查看对象使情况变得更加不清楚。我只想要从基础到派生的演员表,我不知道为什么它不起作用。
我有一个类似这样的类结构:
class BoundaryCondition {
public:
virtual void DoSomething() = 0;
virtual ~BoundaryCondition() { /* * */ }
}
class ReflectingBc : BoundaryCondition {
public:
virtual void DoSomething();
}
class MarshakBc : BoundaryCondition {
public:
virtual void DoSomething();
MarshakBc(double value);
void changeValueLaterOn(double value);
private:
double value_;
}
我(基本上)有一个std::vector<BoundaryCondition*>
代表问题部分边界条件的 a 。我希望能够接受它,vector
并且对于其中的所有MarshakBc
对象,调用changeValueLaterOn
. 所以我有一个看起来像的循环
for (std::vector<BoundaryCondition*>::iterator bc = bcPtrs_.begin();
bc != bcPtrs_.end(); ++bc)
{
if (std::string(typeid(MarshakBc).name()) == std::string(typeid(**bc).name()) )
{
std::cerr << "SAME! ";
}
if (typeid(MarshakBc) != typeid(**bc))
{
std::cerr << "NOT SAME ";
}
MarshakBc* thisBc = dynamic_cast<MarshakBc*>( &( **bc ) );
if (thisBc == NULL) {
std::cerr << "...nothing\n";
continue;
}
thisBc->changeValueLaterOn( 1.23);
std::cerr << "...set!\n";
}
如果我的向量包含 a ReflectingBc*
,那么 a MarshakBc*
,我的输出如下所示:
NOT SAME ...nothing
SAME! NOT SAME ...nothing
我对dynamic_cast
and有什么误解typeid
吗?
[实际情况比这复杂,因为定义和BoundaryCondition
上面的代码在不同的翻译单元,涉及到模板等,但是上面的代码很能代表我正在做的事情和我正在做的结果得到。]
更多细节
这是我的实际例程,它在仿函数内部使用,LoAnisoBc
是派生类,BoundaryConditionT
也是基类:
template<class SnTraits_T, class LoTraits_T>
void FillLoAnisoBcs<SnTraits_T, LoTraits_T>::operator() (
const BoundaryFaceT& bf,
BoundaryConditionT& bc)
{
std::cerr << "Want " << typeid(LoAnisoBc).name() << "\n";
std::cerr << "Chkg " << typeid(bc).name() << "\n";
if (std::string(typeid(LoAnisoBc).name()) == std::string(typeid(bc).name()) )
{
std::cerr << " SAME!";
}
if (!(typeid(LoAnisoBc) == typeid(bc))) {
std::cerr << "...nothing\n";
}
// if we're not an "anisotropic BC", don't do anything
LoAnisoBc* anisoBc = dynamic_cast<LoAnisoBc*>( &bc );
if (anisoBc == NULL) {
std::cerr << "...nothing\n";
return;
}
anisoBc->setFCoeff( fCoeff_ );
std::cerr << "; set fCoeff = " << fCoeff_ << "\n";
}
这是输出
Want N6detLib17cellDiffusionOned28AnisotropicBoundaryConditionE
Chkg N6detLib17cellDiffusionOned27ReflectingBoundaryConditionE
NOT SAME...nothing
Want N6detLib17cellDiffusionOned28AnisotropicBoundaryConditionE
Chkg N6detLib17cellDiffusionOned28AnisotropicBoundaryConditionE
SAME! NOT SAME...nothing
所以bcPtrs_
结构和边界条件在一个动态库中(所以它是Python中的一个模块),而实例化FillLoAnisoBcs
在另一个动态库中。Erik 认为这是可能的问题,我同意。