複数レベルの継承を持つクラス階層があります。
cloneable
を返す純粋仮想メンバー関数を宣言しますcloneable *
。base
から派生しますがcloneable
、メンバー関数を宣言しません。- 最後に、仮想関数
derived
から派生しbase
て定義しますが、戻り値の型を にオーバーライドしますderived *
。
オブジェクトへのbase
ポインタを介して仮想関数を呼び出すと、が返されます。に変換可能な仮想関数の実装が返されるため、私は期待していました。ここで何が起こっているのですか?derived
cloneable *
base *
derived *
base *
で純粋仮想関数を宣言すればbase
、ようやく取得できるのですがbase *
、なぜこの宣言が必要なのかがわかりません。
コード:
struct cloneable
{
virtual cloneable * clone() = 0;
};
struct base : cloneable
{
// virtual base * clone() = 0; // this line resolves the compile error
};
struct derived : base
{
virtual derived * clone () { return new derived; }
};
int main(int, char**)
{
derived d;
base * bp = &d;
base * bbp = bp->clone(); // error: invalid conversion
// from ‘cloneable*’ to ‘base*’
return 0;
}
注: コード例を短くするために、意図的に仮想デストラクタを省略しました。