継承によって2つの単純なクラスを作成し、子クラスに仮想関数とオーバーライドを追加します。C++:ポインタのない共変な戻り値型
この場合class Parent
{
public:
virtual Parent foo();
};
class Child : public Parent
{
public:
Child foo() override;
};
は、私のオーバーライドされた関数がエラーを取得する:error C2555: 'Child::foo': overriding virtual function return type differs and is not covariant from 'Parent::foo'
私はポインタと戻り値の型を変更する場合:
class Parent
{
public:
virtual Parent* foo();
};
class Child : public Parent
{
public:
Child* foo() override;
};
エラーがなくなって! 戻り値の型の共分散をポインタで行う必要があり、値型または参照を使用できない理由を理解できません。 一部のWebサイトまたはフォーラムでは、戻り値が関数で使用される値のコピーであるため、コンパイラはポインタの定数サイズを認識しますが、オーバーライドされた関数と親関数のサイズが異なる必要があります。
この場合、ポインタ以外のものを使用できないのはなぜですか? ポインタを使用せずにオーバーライドされた関数で子タイプを使用する場合は、各関数の基本クラスを返し、返されたタイプを子タイプにキャストする必要がありますか?
マイナーサイド以外:ポインタを使用する必要はありません。参照も使用できます。 –
"関数を使用しないで関数ごとに基本クラスを返し、返された型を子型にキャストする必要があります。"いいえ、親オブジェクトを子にキャストできません。返されるオブジェクトは完全なオブジェクトです。子はありません。 'return child;と言うと、返す子オブジェクトはスライスされ、' Parent'部分だけのコピーが返されます。 –