正如 Scott Myers 所写,您可以利用 C++ 类型系统中的放松来声明 clone() 以返回指向正在声明的实际类型的指针:
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
编译器检测到 clone() 返回一个指向对象类型的指针,并允许 Derived 覆盖它以返回一个指向derived 的指针。
最好让 clone() 返回一个暗示所有权语义转移的智能指针,如下所示:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
不幸的是,约定的放宽不适用于模板化智能指针,并且编译器将不允许覆盖。
所以,看来我有两个选择:
- 让 clone() 返回一个“哑”指针,并记录客户负责处理它的文件。
- 让 clone() 返回一个智能基指针,并让客户端在需要时使用 dynamic_cast 将它们保存到派生指针。
这些方法之一是首选吗?或者有没有办法让我吃掉我的所有权语义转移并拥有我强大的类型安全性?