← 模式
虚构造函数
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
指针。或者,你可以提供非虚的包装函数。