← 模式

虚构造函数

1234567891011121314151617181920212223#include <memory> class Base { public: virtual ~Base() {} virtual Base* clone() const = 0; }; class Derived : public Base { public: Derived* clone() const override { return new Derived(*this); } }; void foo(std::unique_ptr<Base> original) { std::unique_ptr<Base> copy{original->clone()}; }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

通过指向基类型的指针创建对象的副本。

描述

除非知道对象的静态类型,否则无法复制它,因为编译器必须知道需要分配多少空间。因此,我们不能直接通过指向基类的指针来复制派生类对象。

虚构造函数是一种技术,它通过使用虚函数将复制对象的行为委托给派生类。为了演示,我们在第 8 行声明了一个 Base 的虚成员函数(通常命名为 clone),每个派生类都将实现该函数以返回自身的副本。Derived 类在第 14-17 行实现了这个 clone 函数,它只需创建自身的副本并返回。

现在,考虑在第 20 行,我们有一个指向派生类对象的 std::unique_ptr<Base>,我们希望复制这个对象(它也可以是 Base* 或任何其他指向 Base 的智能指针)。要执行此复制,我们只需通过该指针在第 22 行调用虚成员函数 clone。借助多态性,这将调用 Derived 类中 clone 的实现,从而返回一个指向原始派生对象副本的指针。

注意:无法直接用智能指针实现虚构造函数,因为派生类的虚成员函数必须具有协变返回类型。一种解决方法是让 Derived::clone 返回一个 Base 指针。或者,你可以提供非虚的包装函数

贡献者

  • Joseph Mansfield
  • Tomasz Woźniak
  • Tomasz Woźniak

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享