8

C ++では、戻り型が元の戻り型のサブクラスである限り、サブクラスは仮想関数をオーバーライドするときに別の戻り型を指定できます(両方ともポインター/参照として返されます)。

この機能をスマートポインターにも拡張することは可能ですか?(スマートポインタがいくつかのテンプレートクラスであると仮定します)

説明する:

class retBase {...};
class retSub : public retBase {...};

class Base
{
    virtual retBase *f();
};

class Sub : public Base
{
    virtual retSub *f();     // This is ok.
};


class smartBase
{
    virtual smartPtr<retBase> f();
};

class smartSub : public smartBase
{
    virtual smartPtr<retSub> f();     // Can this be somehow acheived?
};

編集:コンラッド・ルドルフが示唆したように、これは直接可能ではありません。しかし、私はこの方法に出くわしました:

class smartBase
{
    protected:
        virtual retBase *f_impl();
    public:
        smartPtr<refBase> f()
        {
             return f_impl();
        }
};

class smartSub : public smartBase
{
    protected:
        virtual retSub *f_impl();
    public:
        smartPtr<refSub> f()
        {
             return f_impl();
        }
};

このように行くことを提案しますか?

4

2 に答える 2

8

この機能をスマートポインターにも拡張することは可能ですか?(スマートポインタがいくつかのテンプレートクラスであると仮定します)

いいえ:C ++は、共変または反変のテンプレートを認識/許可しません。から継承した場合でも、型Ptr<A>と。の間に関係はありません。Ptr<B>AB

于 2009-07-12T11:51:07.953 に答える
-1

Boost shared_ptr は、ポリモーフィック ポインターを保持できます。共変の戻り値の型が必要な場合は、サブタイプに固有のものを使用する必要があります。その場合、戻り値の型を変更せずに、dynamic_pointer_cast を使用してポインターをダウンキャストできます。

于 2010-07-26T09:19:54.973 に答える