C++中如何通过智能指针实现返回类型协方差的长尾函数设计?

2026-04-16 22:551阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计451个文字,预计阅读时间需要2分钟。

C++中如何通过智能指针实现返回类型协方差的长尾函数设计?

在C++中,我们可以这样实现仿原创新:

cppstruct Base { virtual Base* Clone() const { ... } virtual ~Base() {}};

struct Derived : Base { virtual Derived* Clone() const override { ... }};

在C中我们可以这样做:

struct Base { virtual Base* Clone() const { ... } virtual ~Base(){} }; struct Derived : Base { virtual Derived* Clone() const {...} //overrides Base::Clone };

但是,以下内容不会做同样的伎俩:

C++中如何通过智能指针实现返回类型协方差的长尾函数设计?

struct Base { virtual shared_ptr<Base> Clone() const { ... } virtual ~Base(){} }; struct Derived : Base { virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone };

在此示例中,Derived :: Clone隐藏Base :: Clone而不是覆盖它,因为标准表示重写成员的返回类型可能仅从引用(或指针)更改为base到引用(或指针)到派生.这有什么聪明的解决方法吗?当然有人可能会争辩说Clone函数无论如何都应该返回一个普通的指针,但是现在让我们忘记它 – 这只是一个例证.我正在寻找一种方法来启用虚拟功能的返回类型从智能指针更改为Base到指向Derived的智能指针.

提前致谢!

更新:感谢Iammilind,我的第二个例子确实无法编译

您无法直接执行此操作,但在非虚拟接口惯用法的帮助下,有几种方法可以模拟它.

在原始指针上使用协方差,然后将它们包装起来

struct Base { private: virtual Base* doClone() const { ... } public: shared_ptr<Base> Clone() const { return shared_ptr<Base>(doClone()); } virtual ~Base(){} }; struct Derived : Base { private: virtual Derived* doClone() const { ... } public: shared_ptr<Derived> Clone() const { return shared_ptr<Derived>(doClone()); } };

这只适用于你实际上有一个原始指针开始.

通过铸造模拟协方差

struct Base { private: virtual shared_ptr<Base> doClone() const { ... } public: shared_ptr<Base> Clone() const { return doClone(); } virtual ~Base(){} }; struct Derived : Base { private: virtual shared_ptr<Base> doClone() const { ... } public: shared_ptr<Derived> Clone() const { return static_pointer_cast<Derived>(doClone()); } };

在这里,您必须确保Derived :: doClone的所有覆盖实际上都返回指向Derived或从其派生的类的指针.

本文共计451个文字,预计阅读时间需要2分钟。

C++中如何通过智能指针实现返回类型协方差的长尾函数设计?

在C++中,我们可以这样实现仿原创新:

cppstruct Base { virtual Base* Clone() const { ... } virtual ~Base() {}};

struct Derived : Base { virtual Derived* Clone() const override { ... }};

在C中我们可以这样做:

struct Base { virtual Base* Clone() const { ... } virtual ~Base(){} }; struct Derived : Base { virtual Derived* Clone() const {...} //overrides Base::Clone };

但是,以下内容不会做同样的伎俩:

C++中如何通过智能指针实现返回类型协方差的长尾函数设计?

struct Base { virtual shared_ptr<Base> Clone() const { ... } virtual ~Base(){} }; struct Derived : Base { virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone };

在此示例中,Derived :: Clone隐藏Base :: Clone而不是覆盖它,因为标准表示重写成员的返回类型可能仅从引用(或指针)更改为base到引用(或指针)到派生.这有什么聪明的解决方法吗?当然有人可能会争辩说Clone函数无论如何都应该返回一个普通的指针,但是现在让我们忘记它 – 这只是一个例证.我正在寻找一种方法来启用虚拟功能的返回类型从智能指针更改为Base到指向Derived的智能指针.

提前致谢!

更新:感谢Iammilind,我的第二个例子确实无法编译

您无法直接执行此操作,但在非虚拟接口惯用法的帮助下,有几种方法可以模拟它.

在原始指针上使用协方差,然后将它们包装起来

struct Base { private: virtual Base* doClone() const { ... } public: shared_ptr<Base> Clone() const { return shared_ptr<Base>(doClone()); } virtual ~Base(){} }; struct Derived : Base { private: virtual Derived* doClone() const { ... } public: shared_ptr<Derived> Clone() const { return shared_ptr<Derived>(doClone()); } };

这只适用于你实际上有一个原始指针开始.

通过铸造模拟协方差

struct Base { private: virtual shared_ptr<Base> doClone() const { ... } public: shared_ptr<Base> Clone() const { return doClone(); } virtual ~Base(){} }; struct Derived : Base { private: virtual shared_ptr<Base> doClone() const { ... } public: shared_ptr<Derived> Clone() const { return static_pointer_cast<Derived>(doClone()); } };

在这里,您必须确保Derived :: doClone的所有覆盖实际上都返回指向Derived或从其派生的类的指针.