Dynamic_Cast 向量元素

Dynamic_Cast vector elements

我正在尝试创建一个包含基数 class 元素的新型向量。我所做的是将基础 class 向量元素的 dynamic_cast 转换为派生类型,以便应用我在派生 class 中添加的一些方法。

这是我大致做的:

std::vector<BaseClass *> A;
std::vector<DerivedClass *> B;
DerivedClass *m = new DerivedClass;
std::vector<BaseClass *>::const_iterator iterator = A.begin();
AMD_STD::vector<BaseClass *>::const_iterator iteratorEnd = A.end()

for(; iterator!= iteratorEnd; ++iterator)
{
 m = dynamic_cast<DerivedClass *>(*iterator); 
 B.push_back(m);
}
 B->MyMethod();

问题是当我尝试应用该方法时我有一个 NULL 指针并且它正在生成执行错误。 我认为问题是由于 dynamic_cast 失败造成的。谁能帮我解决这个问题。 提前致谢。

如果 dynamic_cast<DerivedClass*>(*iterator) 失败并且 returns nullptr*iterator 不是 nullptr 时,那么您已经向向量中添加了一个元素 类型BaseClass*,但不是类型DerivedClass*。就这么简单。

虽然您没有展示任何添加矢量元素的代码,但您明确表示 "This is what I approximately did",这为其他真理留下了空间。

显然,当 Bvector 时,B->MyMethod(); 将无法编译,但假设您稍后尝试遍历 B 并调用 MyMethod 在其中的每个指针上,您的问题将是您推入 vector Bnullptrs。为避免将它们放在那里,仅在它们不为空时才推送:

for( ; iterator!= iteratorEnd; ++iterator)
     if (m = dynamic_cast<DerivedClass *>(*iterator))
         B.push_back(m);

另外,我建议将变量生命周期本地化到尽可能小的使用范围并使用 C++11 表示法:

for (auto& base_ptr : B)
     if (DerivedClass* p = dynamic_cast<DerivedClass *>(base_ptr))
         B.push_back(p);