在std :: containers中使用受保护继承的原因

时间:2016-03-07 17:44:01

标签: c++ inheritance c++-standard-library

GCC implementation of std::vector类似于以下代码:

#include <memory>

template<
  typename T,
  typename Allocator
  > struct vector_base {

  using T_alloc = typename std::allocator_traits<Allocator>::template rebind_alloc<T>;
  using pointer = typename std::allocator_traits<T_alloc>::pointer;

  struct vector_imp
      : public T_alloc {

    pointer m_start;
    pointer m_finish;
    pointer m_end_of_storage;

    vector_imp()
        : m_start(), m_finish(), m_end_of_storage() { }

    vector_imp(const T_alloc& a)
        : T_alloc(a), m_start(), m_finish(), m_end_of_storage() { }

    // move constructor and swap defined here...
  };

  vector_imp m_imp; // the sole member of vector_base

  // methods for allocating/deallocating and creating storage;
  // destructor.

};

// this class is the "actual" std::vector which you instantiate via
// std::vector<T> x;
template<
  typename T,
  typename Allocator = std::allocator<T>
  > class vector
    : protected vector_base<T, Allocator> {
  // all the interface is implemented in terms of calls to vector_imp;
  // this class has no members (except, of course, from the member of
  // vector_base<T, Allocator>)
};

本质上,API是根据基类和实现类实现的。实现类包含三个必不可少的成员:存储开始,数据结束和存储结束。

我理解为什么vector_imp派生自T_alloc:空基优化将确保无状态分配器不会占用std::vector中的任何空格。

但是,我不明白为什么vector使用vector_base的受保护继承。我本来以为它是私有继承:没有人需要知道vector<T, A> vector_base<T, A>实现,甚至不是vector<T, A>派生的类,因为它并不意味着是子类。

您能为这种设计选择提供解释吗?

1 个答案:

答案 0 :(得分:2)

我怀疑对此有任何合理的解释。这个受保护的继承可以追溯到最初的SGI STL实现 - 可以说是第一个实现?可能会回来,而不是有人认为毕竟会有继承传统的classess,可能是库中包含的那些。

它没有发生(据我所知,至少 - 在stdcxx标准库实现中没有vector的后代),但可能没有人对更改这个继承说明符感兴趣。