你不应该从std :: vector继承

好吧,这是很难承认,但我现在确实有一个强大的诱惑,从std::vector继承。

我需要大约10个定制的矢量算法,我希望它们是矢量的直接成员。 但自然我也想拥有std::vector接口的其余部分。 那么,作为守法的公民,我的第一个想法是在MyVector类中有一个std::vector成员。 但是接下来我将不得不手动重新提供所有std :: vector的接口。 输入太多。 接下来,我想到了私有继承,所以不用再提供方法,我会在公共部分编写一堆using std::vector::member的代码。 实际上这也很乏味。

在这里,我真的认为我可以简单地从std::vector公开继承,但是在文档中提供了一个警告,该类不应该多形地使用。 我认为大多数开发人员足以胜任,无论如何都不应该多形地使用它。

我的决定是绝对无理的吗? 如果是这样,为什么? 你能否提供一个替代方案,让其他成员实际上可以成为成员,但不会涉及重新输入vector的所有接口? 我对此表示怀疑,但如果可以的话,我会很开心。

此外,除了一些白痴可以写类似的事实

std::vector<int>* p  = new MyVector

使用MyVector有没有其他现实风险? 通过说实际的我放弃像想象一个函数,它需要一个指向向量的指针...

那么,我已经说明了我的情况。 我犯罪了。 现在取决于你原谅我还是不是:)


其实, std::vector公有继承没有任何问题。 如果你需要这个,就这样做。

如果真的有必要,我会建议这样做。 只有当你用自由函数做不到你想要的东西时(例如应该保持某种状态)。

问题是MyVector是一个新的实体。 这意味着一个新的C ++开发人员在使用它之前应该知道它到底是什么。 std::vectorMyVector什么MyVector ? 哪一个更适合在这里和那里使用? 如果我需要将std::vector移动到MyVector怎么MyVector ? 我可以使用swap()还是不使用?

不要为了让某些东西看起来更好而创造新的实体。 这些实体(特别是这种共同的)不会生活在真空中。 他们将生活在不断增加的熵的混合环境中。


整个STL的设计方式是算法和容器是分开的

这导致了不同类型迭代器的概念:常量迭代器,随机访问迭代器等。

因此,我建议你接受这个约定,并设计你的算法,使他们不会关心他们正在处理的容器是什么 - 他们只需要一个特定类型的迭代器,他们需要执行它们操作。

另外,让我重新引导您对杰夫阿特伍德的一些很好的评论


不公开从std :: vector继承的主要原因是没有虚拟析构函数,它可以有效地阻止你对多态后代的使用。 尤其是,不允许delete实际指向派生对象的std::vector<T>* (即使派生类不添加任何成员),但编译器通常无法警告您。

在这些条件下允许私有继承。 因此,我建议使用私有继承并从父级转发所需的方法,如下所示。

class AdVector: private std::vector<double>
{
    typedef double T;
    typedef std::vector<double> vector;
public:
    using vector::push_back;
    using vector::operator[];
    using vector::begin;
    using vector::end;
    AdVector operator*(const AdVector & ) const;
    AdVector operator+(const AdVector & ) const;
    AdVector();
    virtual ~AdVector();
};

您应该首先考虑重构您的算法以从它们正在操作的容器类型中抽象出来,并将它们留作免费的模板函数,正如大多数答复者所指出的那样。 这通常通过使算法接受一对迭代器而不是容器作为参数来完成。

链接地址: http://www.djcxy.com/p/9135.html

上一篇: Thou shalt not inherit from std::vector

下一篇: Python class inherits object