我们说我有一个class A
,其扩展为B
和C
。现在,由于缺乏多态性,我使用基类指针指向派生类对象。
A *a = new B(); OR A *a= new C();
现在,让我们说我已经执行了一些陈述。现在,我有兴趣识别基类指针指向的对象的类型。怎么办呢?
答案 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