C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のRTTI(実行時型情報)とは?仕組みとdynamic_castの使い方を解説

C++におけるRTTI(実行時型情報)とは

本記事では、C++におけるRTTI(Runtime Type Information:実行時型情報)について解説します。RTTIとは、プログラムの実行時にオブジェクトのデータ型に関する情報を取得できるようにするC++の仕組みです。これにより、プログラムが動作している最中にオブジェクトの実際の型を判定することが可能になります。

ただし、RTTIの機能を利用できるのは、対象のクラスが少なくとも1つの仮想関数(virtual関数)を持っている場合のみです。仮想関数が1つも定義されていないクラスは多態的(ポリモーフィック)ではないため、RTTIは有効になりません。

動作しない例:仮想関数がない場合

まずは、正しく動作しない例を見てみましょう。以下のコードではdynamic_castを使用していますが、Baseクラスに仮想関数が存在しないため、コンパイル時に次のようなエラーが発生します。

cannot dynamic_cast base_ptr (of type Base*) to type 'class Derived*' (Source type is not polymorphic)

#include<iostream>
using namespace std;
class Base { };
class Derived: public Base {};
int main() {
   Base *base_ptr = new Derived;
   Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
   if(derived_ptr != NULL)
      cout<<"It is working";
   else
      cout<<"cannot cast Base* to Derived*";
   return 0;
}

仮想関数を追加して正しく動作させる例

次に、Baseクラスに仮想関数を1つ追加してみます。仮想関数が存在することでクラスが多態的(ポリモーフィック)になり、RTTIが有効化されるため、dynamic_castが正しく機能するようになります。

#include<iostream>
using namespace std;
class Base {
   virtual void function() {
      //empty function
   }
};
class Derived: public Base {};
int main() {
   Base *base_ptr = new Derived;
   Derived *derived_ptr = dynamic_cast<Derived*>(base_ptr);
   if(derived_ptr != NULL)
      cout<<"It is working";
   else
      cout<<"cannot cast Base* to Derived*";
   return 0;
}

実行結果

It is working

RTTIのポイントまとめ

  • RTTIは実行時型情報を扱うためのC++の機構で、主にdynamic_cast演算子typeid演算子を通じて利用されます。
  • RTTIが有効になるのは、クラスに仮想関数が少なくとも1つ定義されている場合(多態的なクラスの場合)のみです。
  • dynamic_castによるダウンキャストに失敗した場合、ポインタではNULL(nullptr)が返され、参照の場合はstd::bad_cast例外が送出されます。
  1. C++で学生情報を構造体に格納する方法を解説

    構造体(structure)とは、異なるデータ型の複数の項目をひとつにまとめたデータ構造のことです。さまざまな型を持つレコードを扱う複雑なデータ構造を作成する際に非常に便利で、structキーワードを使って定義します。構造体の基本的な定義例は以下のとおりです。struct employee { int empID; char name[50]; float salary; };ここでは、学生の情報(出席番号・名前・点数・成績)を構造体に格納して表示するプログラムを紹介します。プログラム例#include <iostream> using namespace

  2. C++で再帰を使って累乗を計算する方法【サンプルコード付き】

    数の累乗は x^y の形式で表されます。ここで、x は基数(元の数)、y は指数(べき乗する回数)です。例えば、以下のような計算になります。x = 2、y = 10 の場合 x^y = 1024 つまり、2^10 = 1024 となりますこの累乗は、再帰(リカージョン)を使うことで簡潔に求めることができます。以下に、再帰を利用して累乗を計算するC++プログラムを紹介します。サンプルコード#include <iostream> using namespace std; int FindPower(int base, int power) {    &nb