协变虚函数和智能指针

时间:2009-07-12 11:50:13

标签: c++ templates covariance smart-pointers virtual-functions

在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?
};

编辑:正如Konrad Rudolph所说,这不是直接可行的。但是,我跑这个方法:

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();
        }
};

你会建议这样做吗?

2 个答案:

答案 0 :(得分:8)

  

是否可以将此功能扩展为智能指针? (假设智能指针是一些模板类)

否:C ++不知道/允许协变或逆变模板。类型Ptr<A>Ptr<B>之间没有关系,即使A继承自B

答案 1 :(得分:-1)