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>,即使A继承自B.

于 2009-07-12T11:51:07.953 回答
-1

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

于 2010-07-26T09:19:54.973 回答