あなたは C++ は初めてだと言いますが、必要なものを記述するために使用する構文は、Java や C# などの別の言語に精通していることを示唆しています。表示する構文は、これらの言語で正常に機能します。
Foo myFoo = new DerivedFoo;
これは、Java と C# の舞台裏でmyFoo
、Foo を格納できる固定メモリ領域の名前としてではなく、Foo へのポインターとして実際に動作するためです。C++ では、構文Foo myFoo
によってこのような固定メモリ領域が作成されます。これを実行して派生型を配置しようとしても、次のようになります。
DerivedFoo myDerivedFoo;
Foo myFoo = myDerivedFoo;
myFoo
Foo オブジェクトしか保持できません。Foo ではないものはすべて、myFoo
固定メモリ領域に収まらないため、の初期化中に「スライス」されます。
したがって、C++ では、C++ のポインター構文を使用して、Java と C# が舞台裏で行うことを明示的に行う必要があります。
Foo *myFoo = new DerivedFoo;
現在myFoo
は Foo へのポインターであり、そのポインターはFoo
DerivedFoo の Foo 部分を含む任意のオブジェクトを、スライスや何も発生することなく参照できます。new DerivedFoo
DerivedFoo が存在できるメモリ領域を作成し、作成された の部分myFoo
を指すように設定されます。Foo
DerivedFoo