我一直听说你不应该从没有虚拟析构函数的类继承,而且我也没有多加注意,因为我不经常使用继承。即使你不想使用多态性,这个规则是否适用,但你只是想要所有类的功能,并且你想添加更多?具体而言,只要我没有多态使用它,下面的类是否安全,具有明确定义的行为? (即不删除基地指针派生的对象)从没有虚拟析构函数的类继承
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”和“ranges”),因为out-bound-bound访问是通常是一个*逻辑*错误。 – 2012-03-28 14:31:13
我认为在你的具体例子中,继承并不是一个非常优雅的解决方案,因为继承意味着接口重用,而不是实现重用。你显然不会重用接口,因为你的'operator []'抛出了一个'std :: vector'不会的异常。如果要重用代码,只需使用普通共享函数或(如本例中那样),使'std :: vector'成为'SomewhatSafeVector'的成员。 – 2012-03-28 14:31:40
@KerrekSB:首先,为什么不呢?第二,我没有这样的麻烦。但是我认为边界检查容器对于教学和调试目的来说是个好主意。 – 2012-03-28 14:34:22