クロスキャスト

ロベールのC++入門講座 13-08

例えば以下のような多重継承の関係のクラスがあるとします。

class CBaseA {
public:
    virtual ~CBaseA() {}
};
class CBaseB {
public:
    virtual ~CBaseB() {}
};
class CSample : public CBaseA, public CBaseB {};

この状態でCBaseAからCSampleへダウンキャストし、今度はCSampleからCBaseBへとアップキャストしてみます。

#include <iostream>
using std::cout; using std::endl;

class CBaseA {
public:
    virtual ~CBaseA() {}
};
class CBaseB {
public:
    virtual ~CBaseB() {}
};
class CSample : public CBaseA, public CBaseB {
};

int main () {
    // ダウンキャスト可能にするための下準備
    CBaseA* a_obj = new CSample;
    
    // CSampleへダウンキャスト
    CSample* s_obj = dynamic_cast<CSample*>(a_obj);
    
    if ( s_obj == NULL ) {
        cout << "ダウンキャストに失敗しました" << endl;
        return 0;
    }
    
    // CBaseBへアップキャスト
    CBaseB* b_obj = s_obj;
    
    delete a_obj;
    return 0;
}

こういうキャストの手順のことをクロスキャストと言います。

上記例ではわざわざダウンキャストしてからアップキャストすることでクロスキャストを実現しましたが、実はdynamic_castで一発でクロスキャストすることも可能です。

int main () {
    CBaseA* a_obj = new CSample;
    
    // CBaseBへクロスキャスト
    CBaseB* b_obj = dynamic_cast<CBaseB*>(a_obj);
    
    if ( b_obj == NULL ) {
        cout << "クロスキャストに失敗しました" << endl;
        return 0;
    }
    
    delete a_obj;
    return 0;
}

とはいえこんな入り組んだ複雑なキャストなんて多分使う機会はないような気はしますが。