在这种情况下,class deria和derib从基础继承:
class Base
class DeriA : public Base
class DeriB : public Base
std::list<Base> objects;
是否可以从对象列表的每个成员列表中检查哪种类型的类型?我尝试在尝试/捕获语句中使用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,这总是输出"找到"。谁能帮助为什么要阐明为什么?
如果您有Base*
指针,则可以dynamic_cast<DeriA*>
。结果将是铸造对象或null,如果它不是DeriA
。
但是,您正在处理值。您存储在列表中的Base
(不是Base*
)将始终是Base
,而不是派生对象。如果您曾经放置过的DeriA
,则可能在某个时候切片。
从我看到的几乎没有示例中,大多数使用std :: bad_cast异常都使用dynamic_cast。检查此示例,看看Dynamic_cast是否可以为您提供帮助。Dynamic_cast有一个具有多态功能的要求,但是您会弄清楚。
http://en.cppreference.com/w/cpp/types/bad_cast
-ap _
不,您无法正确执行此操作。C 在运行时类型信息的概念中没有构建,因此不可能用静态铸件来看看会发生什么。
一些编译器尽管实现了(可怕的)RTTI系统,该系统允许您使用Dynamic_cast。大多数系统上的RTTI都具有不良的副作用,这会导致QT等大型框架以实现自己的宏观魔术RTTI系统。