【发布时间】:2014-04-15 00:17:51
【问题描述】:
在这种情况下,类 DeriA 和 DeriB 继承自 Base:
class Base
class DeriA : public Base
class DeriB : public Base
std::list<Base> objects;
是否可以检查从对象列表的每个成员继承的类类型? 我尝试在 try/catch 语句中使用 static_cast 以检查对象的某个成员是否为特定类型,如下所示:
try
{
DeriA tempA = static_cast<DeriA>(*objects_iterator);
std::cout << "Found A" << std::endl;
} catch(std::bad_cast e)
{
// Dealing with the exception
std::cout << "Found B" << std::endl;
}
但是,无论被访问的对象是 DeriA 还是 DeriB,这始终会输出“Found A”。谁能帮忙解释一下为什么?
【问题讨论】:
-
并非如此,因为您的列表包含
Base对象。因此,除非派生类型将Base的成员设置为您可以检查的某个值,否则您就不走运了。但总的来说,这表明您需要重新设计。 -
另一个问题是你的继承是私有的,所以派生类型不是
Base。我认为这只是一个错字,并且您打算使用公共继承。 -
确实是错字,谢谢
-
您可能想了解object slicing,这可能是存储在列表中的对象的问题。
-
为什么该代码甚至可以编译? DeriA 是否从 Base 定义了转换构造函数?此外,afaik bad_cast 仅在转换引用时由 dynamic_cast 抛出,而不是 static_cast。
标签: c++ inheritance casting static-cast