14

在 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可以移动并需要处理其他对象不需要的对象。

4

3 回答 3

29

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

if( Moveable* moveable_john = dynamic_cast< Moveable* >( &John ) )
{
    // do something with moveable_john
}
于 2012-10-18T20:40:43.490 回答
13

您正在使用私有继承,因此无法用于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
}
于 2012-10-18T20:42:41.340 回答
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
{
}
于 2012-10-18T20:45:01.317 回答