原型模式的核心是 clone() 函数而非构造函数,需声明为虚函数(通常纯虚)以支持多态,返回基类指针,子类实现深拷贝;裸指针须手动分配内存,推荐用 std::vector 等自动管理资源类型。

原型模式的核心是 clone() 函数,不是构造函数
你不能靠 new MyClass() 来实现原型模式——那只是常规实例化。原型模式的关键在于让已有对象自己负责复制自己,所以必须提供一个虚函数 clone(),且通常声明为纯虚,强制子类实现。父类不负责知道子类怎么构造,只约定“你能把自己完整复制一份”。
-
clone()返回的是基类指针(通常是Base*),调用方无需知道具体类型 - 子类的
clone()必须用new创建新对象,并逐字段拷贝(深拷贝!) - 如果忘记把
clone()声明为virtual,多态就失效,调用的永远是基类版本
深拷贝陷阱:指针成员不处理就会 double-free
原型对象里只要含裸指针(比如 int* data),clone() 就不能直接用默认拷贝构造——那只是浅拷贝,两个对象指向同一块内存。运行时可能崩溃,也可能改了副本却影响原对象。
- 必须在子类
clone()里手动new新内存,并memcpy或循环拷贝内容 - 推荐改用
std::vector、std::string等自动管理资源的类型,它们的拷贝构造天然深拷贝 - 如果用了
std::unique_ptr,记得在clone()里调用std::make_unique并拷贝所指对象,而不是直接拷贝智能指针本身(否则仍是浅层转移)
注册表方式避免硬编码 new,但得管好生命周期
想用字符串名(如 "Circle")创建原型?可以建个静态 std::map<:string base></:string> 存原型实例,用时 prototypes.at(name)->clone()。但注意:注册的原型对象必须长期有效。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 不能注册局部变量地址(函数返回后指针悬空)
- 推荐用静态局部对象或
std::shared_ptr管理原型池,避免裸指针生命周期失控 - 注册键名大小写敏感,
"circle"和"Circle"是两个不同原型
拷贝构造函数和 clone() 不是一回事
有人以为写了拷贝构造函数就够了,其实不对。Base* p = new Circle(); Base* q = new Circle(*p); 这样写会调用 Circle 的拷贝构造,但类型写死,无法通过基类指针泛化创建。而 clone() 是运行时动态分发的。
立即学习“C++免费学习笔记(深入)”;
- 拷贝构造函数参数类型固定,编译期绑定;
clone()是虚函数,运行时根据实际对象类型调用对应实现 - 如果你只依赖拷贝构造,就失去了“用一个实例决定创建哪种子类”这个核心能力
- 典型错误:在
clone()里直接 return new Derived(*this),却忘了*this是基类引用,可能触发切片(slicing)——必须确保this是派生类对象且Derived的拷贝构造正确处理了所有字段
原型最难的部分不在写 clone(),而在判断哪些字段该深拷贝、哪些可共享、哪些根本不能拷贝(比如文件句柄、socket)。这些决策没法靠模式自动解决,得看你的对象语义。
















