重複の可能性:
派生**からベース**への変換
私は、主に Python を数年間使用した後、C++ に戻ってきましたが、強く型付けされた壁にぶつかっています。私は基本的なポリモーフィズムと、基本クラスと派生クラスのポインター間の型キャストをうまく処理していると思います (たとえば、派生クラスのポインターをその基本クラスのポインターに型キャストすることはできますか? )。派生クラスへのポインターへのポインターを、その基本クラスへの p-to-p に割り当てませんか?
より多くのコンテキスト (およびおそらく、これをあまり Python らしくしないためのヒント) については、私がやろうとしていることの縮小版を次に示します。オブジェクト (単一のクラスから派生) へのポインターのリストと、それらを識別する文字列 (つまり a map<string, obj*>
) が必要です。コンポーネントのセットは、識別文字列と位置のリストを渡して、対応するオブジェクト (つまり a map<string, obj**>
) へのポインターを格納します。その後、文字列 ID で適切なオブジェクトを見つけ、コンポーネントが後で使用できるように適切なポインターを入力できるはずです。これを行う単純化されたコードは次のとおりです。
#include <map>
#include <string>
using namespace std;
class base
{
};
class derived: public base
{
};
typedef map<string, base**> BasePtrDict;
typedef map<string, base*> BaseDict;
int main(int argc, char* argv[])
{
base b1, b2;
derived d;
derived* d_ptr;
BaseDict base_dict;
base_dict["b1"] = &b1;
base_dict.insert(make_pair("b2",&b2)); // alternate syntax
base_dict["d"]= &d;
BasePtrDict ptr_dict;
ptr_dict["d"] = &d_ptr;
for (auto b = ptr_dict.begin(); b != ptr_dict.end(); b++)
*(b->second) = base_dict[b->first];
return 0;
}
これにより、 でコンパイル エラーが発生しptr_dict["d"] = &d_ptr;
ます。なんで?C++ パラダイムでは、何をすればよいですか? reinterpret_cast<base>()
どこでも醜い(安全でない?)ことを本当にする必要がありますか?