【问题标题】:Covariant virtual functions and smart pointers协变虚函数和智能指针
【发布时间】:2024-04-10 14:00:02
【问题描述】:

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

你会建议走这条路吗?

【问题讨论】:

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


    【解决方案1】:

    是否也可以将此功能扩展到智能指针? (假设智能指针是某个模板类)

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

    【讨论】:

    【解决方案2】:

    Boost shared_ptr 可以保存多态指针。如果你想要一个协变返回类型,那么你想要使用特定于子类型的东西。在这种情况下,您可以保持返回类型不变,并使用 dynamic_pointer_cast 向下转换指针。

    【讨论】: