参照のダウンキャスト

http://www.geocities.jp/ky_webid/cpp/language/024.html

ポインタ変数じゃなく、参照の場合もダウンキャストすることが可能です。

ただしエラー処理のやり方がちょっと違うので注意が必要です。

#include <iostream>
using namespace std;

class CBase {
public:
    virtual ~CBase () {}
};

class CSub : public CBase {
};

int main () {
    CSub obj;
    CBase& objBase = obj;
    
    try {
        CSub& objSub = dynamic_cast<CSub&>( objBase );
    }
    catch ( std::bad_cast ) {
        cout << "ダウンキャストに失敗しました" << endl;
    }
    
    return 0;
}

try、catchという構文が出てきていますがこれは後の章で解説があるとのことなのでとりあえずこういうものとして置いておきましょう。

tryブロックの中でとにかくエラーが発生したらcatchで指定したエラー内容のものを処理するといった感じでしょう。

ちなみにstdはusingしているのでcatch( bad_cast )でもコンパイルは通ります。

なぜポインタのように戻り値がNULLかどうかで判断できないのかというと、参照はポインタじゃないのでNULLを格納できないからです。

だからエラーを発生させているということになります。