2016-11-16 2 views
1

質問私は2つのクラスがある場合は、CPPに

をオブジェクトのキャストについての二つの質問:「父」、および「MyClassaを」と、私はこれをしたい:

father* a; 
MyClassa b; 
a = &b; 
((MyClassa *)a) - > b(); 

私ができます上のサンプル(b()MyClassaクラスに属し、fatherクラスにはない関数です)のようなキャストを行います。

しかし、私はこれを行うとき:

father* a; 
MyClassa b; 
a = &b; 
a = ((MyClassa *)a); 
a->b(); 

をそれは私のために仕事をdoesntのと、彼はb()機能(鋳造のように動作しませんでした)、そのクラスには存在しないことを私に伝えます。

これら2つのコードサンプルの違いは何ですか?また、この違いの原因は何ですか?

質問B

私はこのような子供のように父親をキャストする 'dynamic_castを' を使用し

Father * fp= new Father; 
Child * cp = dynamic_cast<Child *> fp; 

それは私にポインタを '0' の値を返します。 しかし、私は参照して同じことを行うとき:

Father & fp= new Father; 
Child & cp = dynamic_cast<Child &> fp; 

それはエラー「悪いキャスト」を発生させます。

なぜ違いがありますか?この行の

+1

は私たちに、より完全な例を与えるも、多型の観点で「間違った」子供に父親からの参照をキャストすることは不可能だ、と。 「MyClassa」のクラス宣言はどのように見えるのですか? –

+0

[MCVE]を表示してください。 –

+0

これらの質問は無関係ですので、それらを分けてください。 – Tali

答えて

1

用語はMyClassa*にキャストが、その後戻っfather*に(割り当てで)あなたはfather*で終わるます。あなたの2番目の質問については

:それは

+0

ありがとうございます。 2番目の質問に関して - なぜ私が父のポインタから子のポインタ(参照ではなくポインタです)をキャストしたら、それは私に0の値を返し、キャスティングエラーも投げないのですか? –

+0

からhttp://en.cppreference.com/w/cpp/language/dynamic_cast: キャストが失敗し、new_typeがポインタ型の場合、その型のnullポインタが返されます。キャストが失敗し、new_typeが参照型の場合は、std :: bad_cast型のハンドラに一致する例外がスローされます。 – gbehar

関連する問題