【发布时间】:2012-03-28 14:18:07
【问题描述】:
我一直听说你不应该从没有虚拟析构函数的类继承,而我并没有太在意,因为我只是不经常使用继承。即使您不想使用多态性,但您只想要一个类的所有功能,并且想要添加更多功能,这条规则是否也适用?具体来说,只要我不以多态方式使用它,下面的类是否是安全的、具有明确定义的行为? (即不删除派生对象的基指针)
template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;
T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};
【问题讨论】:
-
如果不用多态就可以了。
-
不管它是否可以,但您仍然不应该从标准库容器派生。此外,如果您在访问动态容器的范围内遇到问题,您可能更愿意查看您的全局算法思维(想想“0-1-many”和“范围”),因为越界访问是通常是一个逻辑错误。
-
我认为在您的特定示例中,继承并不是一个非常优雅的解决方案,因为继承是为了接口重用,而不是实现重用。您显然不重用该接口,因为您的
operator[]会引发std::vector不会的异常。如果您想重用代码,只需使用普通的共享函数或(如本例所示)将std::vector设为SomewhatSafeVector的成员。 -
@KerrekSB:第一个,为什么不呢?到第二个,我没有这样的麻烦。但我认为边界检查容器对于教学和调试来说是一个好主意。
-
@FrerichRaabe:我大体上同意。而且我实际上已经完全实现了一个边界检查向量类,它带有边界检查迭代器,它就是这样做的。我只是想知道是否可以通过使用继承来节省一些时间,以免重写不需要边界检查的函数。
标签: c++ inheritance