检查对象的类型是否继承自特定的类

时间:2012-10-18 20:35:41

标签: c++ oop inheritance types

在C ++中,如何检查对象的类型是否继承自特定的类?

class Form { };
class Moveable : public Form { };
class Animatable : public Form { };

class Character : public Moveable, public Animatable { };
Character John;

if(John is moveable)
// ...

在我的实现中,if查询将在Form列表的所有元素上执行。从Moveable继承的所有类型的对象都可以移动并需要处理其他对象不需要的对象。

3 个答案:

答案 0 :(得分:24)

您需要的是dynamic_cast。在其指针形式中,如果无法执行强制转换,它将返回空指针:

if( Moveable* moveable_john = dynamic_cast< Moveable* >( &John ) )
{
    // do something with moveable_john
}

答案 1 :(得分:10)

您正在使用私有继承,因此无法使用dynamic_cast来确定是否有一个类派生自另一个类。但是,您可以使用std::is_base_of,它将在编译时告诉您:

#include <type_traits>

class Foo {};

class Bar : Foo {};

class Baz {};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_base_of<Foo, Bar>::value << '\n'; // true
    std::cout << std::is_base_of<Bar,Foo>::value << '\n';  // false
    std::cout << std::is_base_of<Bar,Baz>::value << '\n';  // false
}

答案 2 :(得分:4)

  

运行时类型信息(RTTI)是一种允许该类型的机制   程序执行期间要确定的对象。 RTTI已添加   因为很多类库的供应商都使用C ++语言   自己实现这个功能。

示例:

//moveable will be non-NULL only if dyanmic_cast succeeds
Moveable* moveable = dynamic_cast<Moveable*>(&John); 
if(moveable) //Type of the object is Moveable
{
}