在多态性期间识别对象的类型

时间:2011-06-27 06:44:38

标签: c++ polymorphism

我们说我有一个class A,其扩展为BC。现在,由于缺乏多态性,我使用基类指针指向派生类对象。

A *a = new B(); OR A *a= new C();

现在,让我们说我已经执行了一些陈述。现在,我有兴趣识别基类指针指向的对象的类型。怎么办呢?

2 个答案:

答案 0 :(得分:8)

直接的方式是使用dynamic_cast

B* b = dynamic_cast<B*>( a );
if( b != 0 ) {
  // the object can be cast to class B safely
}

然而真正的答案是你不需要在你做多态时 - 你必须使用虚函数并在派生类中适当地实现它们,这样你就可以盲目地调用它们并执行正确的代码。

答案 1 :(得分:2)

取决于

您可以使用typeid进行快速且脏的类型识别。

或者您可以使用dynamic_cast来检查您是否拥有给定类型的对象(令人惊讶的是,这可能比typeid更快。)

如果您对派生的对象感兴趣,例如出于散列的目的,如果静态已知的类是多态的,则可以使用dynamic_cast<void*>。这只是间接识别类型。它产生一个指向最派生类型的对象的void指针,您可以将其视为对象的唯一“地址”。

但一般来说,除了序列化之外,尝试识别确切的类型并不是一个好主意 - 序列化远不止于此!

干杯&amp;第h