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. ポインター形式では、キャストを実行できない場合は null ポインターを返します。

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 に答える