11

と呼ばれる基本クラスと、などbaseと呼ばれる派生クラスを作成する場合、基本クラスのインスタンスのコレクションを使用します。要素を取得して使用しようとすると、C++はそのタイプがベースクラスの、おそらくベースのから取得したためです。これは、このオブジェクトがベクターに入れられたときにこのオブジェクトが存在することを知っていた、特定の派生クラスにのみ存在する機能を使用したい場合の問題です。derived_1derived_2std::vector

そこで、要素を想定されているタイプにキャストしましたが、これは機能しないことがわかりました。

(derived_3)obj_to_be_fixed;

そして、それはポインタのことであることを思い出しました。いくつかの調整の後、これは今うまくいきました。

*((derived_3*)&obj_to_be_fixed);

これは正しいですか、それとも、たとえば、abc_cast()より少ない混乱でそれを行う機能がありますか?

編集:

私はこれを別の質問に拡張する必要がありました。完全な解決策がそこに示されています。stackoverflow.com...なぜポリモーフィックタイプのエラーとクリーンアップの質問

4

4 に答える 4

21

オブジェクトをstd::vector<base>そこに格納する場合、派生クラスに戻る方法はありません。これは、派生部分が基本クラスのインスタンスに格納するときにスライスされており(結局、ベクターにはデータのコピーが含まれているため、オブジェクトの基本部分のみがコピーされます)、格納されたオブジェクトが真のインスタンスになるためです。基本クラスとして使用される派生クラスの代わりに、基本クラス。

ポリモーフィックオブジェクトをベクターに格納する場合は、それをstd::vector<base*>(またはベースにするがベース自体ではないある種のスマートポインター)dynamic_cast<derived_3*>にして、正しいタイプにキャストするために使用します(またはstatic_cast、パフォーマンスに敏感で、十分に自信がある場合は、正しいタイプにキャストしようとしています(その場合、間違っていると恐ろしいことが起こりますので、注意してください))。

于 2011-01-08T00:55:07.220 に答える
5

を使用している場合vectorbaseすべてのインスタンスはbaseインスタンスであり、派生インスタンスではありません。

派生インスタンスを挿入しようとすると、オブジェクトはスライスされます。に挿入するにはvector常にコピーが必要であり、ターゲットタイプは、ベクターが保持するオブジェクトのタイプによって決定されます。vector異なるタイプのオブジェクトを保持することはできません。

于 2011-01-08T00:51:18.970 に答える
1

ほとんどの場合、これを行う必要はありません。注意深く設計されたクラス階層は、ポリモーフィズム(つまり仮想関数)によってこれを処理できます。

本当に派生型にキャストする必要がある場合は、dynamic_cast演算子を使用してください。

于 2011-01-08T00:49:25.323 に答える
0

あなたがやろうとしていることは、リモートでさえ可能ではありません。コンテナに格納されているオブジェクトのタイプbaseが、の場合、それらはbase期間です。それらはオブジェクトではなくderived、オブジェクトになることはなく、何をしてもオブジェクトderivedとして使用することはできません。derived

baseポインタを介したキャストは、オブジェクトが占めるメモリをオブジェクトとして再解釈する単なるハックにすぎませんderived。これは完全に無意味であり、偶然にのみ「機能」する可能性があります。

于 2011-01-08T00:56:32.100 に答える