从基类识别派生的类类型



在这种情况下,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系统。

最新更新