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 | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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