2015-10-28 12 views
5

をアップキャスト:(母親、抽象的に)、そしてBとC、暗黙的な変換のは、私は三つのクラスがあるとしましょう

ので、BとC Aの子供はAから継承する(パブリック継承) 。 私はポインタのリストを持っています。これにはBまたはCのポインタがあります。

質問:キャスティング/コンバートを実行するときの優先スタイルですか?

class A {}; 
class B : public A {}; 
class C : public A {}; 

B* objB = new B(); 
C* objC = new C(); 

std::list<A*> myList; 
// Option A: static cast conversion 
myList.push_back(static_cast<A*> (objB)); 
myList.push_back(static_cast<A*> (objC)); 

// Option B: implicit conversion 
myList.push_back(objB); 
myList.push_back(objC); 

// Option C: C-style conversion (I understand that this is evil and must be avoided) 
myList.push_back((A*) objB); 
myList.push_back((A*) objC); 

したがって、明快さ(コードスタイル)と安全性の面でどちらが優れていますか?私はstatic_castを検索する方が簡単だと理解していますが、この場合は暗黙の変換で十分です。

答えて

7

static_castを基本クラスにする必要はありません。static_castは他の方向に進みます。だから、これはあなたがstatic_castに必要があるだろう時間は私がすでに提供さ答えに拡張したい派生クラスB*

B* some_obj = static_cast<B*>(myList.front()); 
+0

これは私が必要とする回答です。アップキャスト時にはstatic_castが、ダウンキャスト時にはyesとなります。ありがとうございました! (そして非常に速い答えです!) – fern17

+1

@ fern17また、ダウンキャストのときには、それがBかCかどうかは分からないかもしれないことに注意してください。それは 'dynamic_cast'のためです。 – JorenHeit

+0

はい、私は知っています、それを明示してくれてありがとう(将来この質問に戻る私の人) – fern17

0

A*をキャスト何かをすることである

myList.push_back(objB); 
myList.push_back(objC); 

結構です非常に一般的な解決策です。

コンパイラが既に暗黙的にキャストしているものを明示的にキャストしないでください。私たちも、このさらに一般化する可能性がある

人間は間違いを犯します。コンパイラがあなたのために何をしているのか明示的には決してしないでください。

...非常に不明瞭な例外的なケースでは、それはもう少し議論の余地があるかもしれませんが。前の文は常に真実でなければなりません。

明示的にキャストすることは、DRYの原則に違反しているだけでなく、さらに重要なことは、将来人為的ミスや混乱を招くことです。

これを必要としないものは明示的にキャストしないでください。明示的なキャストは武器です:それらを不必要にあまりにも頻繁に誇示し、誰かが傷つけるように縛られています。

関連する問題