检查对象的类型是否从特定类继承 在C++中,如何检查对象的类型是否继承自特定的类? class Form { }; class Moveable : public Form { }; class Animatable : public Form { }; class Character : public Moveable, public Animatable { }; Character John; if(John is moveable) // ...

检查对象的类型是否从特定类继承 在C++中,如何检查对象的类型是否继承自特定的类? class Form { }; class Moveable : public Form { }; class Animatable : public Form { }; class Character : public Moveable, public Animatable { }; Character John; if(John is moveable) // ...,c++,oop,inheritance,types,C++,Oop,Inheritance,Types,在我的实现中,if查询是在表单列表的所有元素上执行的。继承自Moveable类型的所有对象都可以移动,并且需要处理其他对象不需要的对象。您需要的是动态\u cast。在其指针形式中,如果无法执行强制转换,它将返回空指针: if( Moveable* moveable_john = dynamic_cast< Moveable* >( &John ) ) { // do something with moveable_john } if(Moveable*Moveab

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

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

if( Moveable* moveable_john = dynamic_cast< Moveable* >( &John ) )
{
    // do something with moveable_john
}
if(Moveable*Moveable\u john=dynamic\u cast(&john))
{
//用moveable_john做点什么
}

您使用的是私有继承,因此无法使用
动态\u cast
来确定一个类是否派生自另一个类。但是,您可以使用,这将在编译时告诉您:

#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
}
#包括
类Foo{};
类栏:Foo{};
类Baz{};
int main()
{
标准::cout
运行时类型信息(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
{
}
//仅当动态强制转换成功时,moveable才为非NULL
可移动*可移动=动态施法(&J);
if(moveable)//对象的类型是可移动的
{
}

私有继承是设计的一部分吗?这会使事情复杂化。所有继承也可能是公共的。这不重要。这很重要。对于私有继承,可能很难找到答案。这对我的程序不重要。我可以灵活地使用公共继承或私有继承。好的,那么公共继承可能就是你想要的。Private继承基本上是组合,即has-a而不是is-a关系。这对私有继承有效吗?如果有效的话就没有意义了。如果我有一个指向
John
的指针呢?除此之外,还有一个编译器错误,它说
字符
不是一个多态类型。@sharethis:
&John
是一个指向
John
的指针,如果您已经有指向
John
的指针,则不需要运算符
&
的地址。这需要允许的RTTI吗?我听说默认情况下并非所有编译器都启用了RTTI,因为它可能会很昂贵。解决方案必须在运行时工作,因为我想迭代我的场景图,这样可以更改时间。@sharethis如果您的继承是私有的,那么这可能很重要。这就是为什么我没有建议
dynamic\u cast
@sharethis我想不出任何符合标准且优雅的方式可以让您在运行时做到这一点。