2010年08月07日

C++の継承と条件演算子の話

C++で次のようなプログラムを書いて……


struct C { };
struct D : C { };
struct E : C { };

int main()
{
	bool expr = true; // 実際にはexprの値を決めるごにょごにょが在る
	C *p = expr ? new D() : new E();

	return 0;
}

コンパイルすると……


>cl test.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
test.cpp(8) : error C2446: ':' : 'E *' 型から 'D *' 型への変換ができません。
        指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

こうなった。

えー、DECの派生クラスだからC *に突っ込んで文句言われる筋合いはないぞー?とちょっと悩んだ。

よく考えたら、

expr ? new D() : new E()

この条件演算、結果の型は何やねん、という。条件が真の場合はD *で、偽の場合はE *?一つの式で結果の型が異なるとかそんなアホな。

結局、


C *p;
if(expr) p = new D();
else     p = new E();

或いは、

C *p = expr ? static_cast<C *>(new D()) : static_cast<C *>(new E());

と書けと。

『派生先のポインタは派生元のポインタにキャスト無しで入れられる』という常識に気をとられて何も考えず書いた結果がこれだよ!反省。

コンパイル
今回はVC++2010 Expressのclを利用。
タグ:C++
posted by 天井冴太 at 04:46 | Comment(0) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

コメント欄右下をドラッグ&ドロップすると、コメント欄の拡大縮小が出来ます。
認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。