通常的克隆习惯使用协变返回类型:
struct Base {
virtual Base* clone();
};
struct Derived : public Base {
Derived* clone();
};
我读过一些内容,大意是协变返回类型是 C++ 后来添加的,较旧的编译器可能不支持它们。在这种情况下Derived
类必须声明它的clone
成员函数返回一个Base*
。因为,大概我只是访问Derived
物体通过Base
使用此惯用法时的指针和/或引用,声明返回类型的真正用途/好处是什么Derived*
?
另外,一个相关问题:
我更喜欢使用智能指针来表达所有权转移语义clone
签名。当使用协变返回类型时这是不可能的,因为auto_ptr<Derived>
不协变auto_ptr<Base>
。 (请注意,我不是在寻找有关使用智能指针的讲座 -auto_ptr
此处仅作为示例)。那么在这种情况下,有什么理由不Derived
return auto_ptr<Base>
?有没有更好的方式来表达所有权转移语义?
因为,据推测,在使用这个习惯用法时,我只是通过基指针和/或引用访问派生对象......
你猜错了。仅仅因为基类存在并不意味着您将始终使用它。如果我有一个Shape
带有子类的类Circle
and Rectangle
,而且我也有一个Window
班级。我不会使用Shape*
当我可以使用时窗口的位置和大小Rectangle
.
对于所有权转移,无论如何您都不应该使用智能指针。我知道你不想听讲座,但我并不是说智能指针不好,你只是不应该在clone()
。你不能转让本来就没有所有权的东西的所有权。如果有人想要一个auto_ptr
那么他们应该使用克隆的原始指针来构造它。其他智能指针类型也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)