正如Scott Myers写的那样,你可以利用C++的类型系统中的松弛来声明clone()返回一个指向所声明的实际类型的指针:
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
Run Code Online (Sandbox Code Playgroud)
编译器检测到clone()返回指向对象类型的指针,并允许Derived覆盖它以返回指向派生的指针.
希望让clone()返回一个智能指针,它意味着所有权语义的转移,如下所示:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,约定的放宽并不适用于模板化的智能指针,编译器也不允许覆盖.
所以,似乎我有两个选择:
这些方法之一是首选吗?或者有没有办法让我吃掉我的所有权语义转移并且我的强大类型安全呢?