C ++语法:ClassA:私有向量<t> {}含义</t>

时间:2014-04-19 07:35:51

标签: c++

我正在阅读C ++文件。我不会在C ++中理解某些结构,但我不知道如何谷歌学习这一点。这是我正在阅读的一段代码:

template <typename value_type>
class iterstack: private vector<value_type> {
   private:
      using vector<value_type>::crbegin;
      using vector<value_type>::crend;
      using vector<value_type>::push_back;
      using vector<value_type>::pop_back;
      using vector<value_type>::back;
      typedef typename vector<value_type>::const_reverse_iterator
              const_iterator;
   public:
      using vector<value_type>::clear;
      using vector<value_type>::empty;
      using vector<value_type>::size;
      const_iterator begin() { return crbegin(); }
      const_iterator end() { return crend(); }
      void push (const value_type& value) { push_back (value); }
      void pop() { pop_back(); }
      const value_type& top() const { return back(); }
};

在上面的代码中,我不明白。

首先:

class iterstack: private vector<value_type>

class iterstack: vector<value_type>(没有private关键字)

的上一行有什么不同

其次:

using vector<value_type>::crbegin;

我真的不明白这句话。 using关键字,我经常在这种形式下使用:using namespace std另一种使用方式让我感到困惑。

请告诉我上面两点的含义。

谢谢:)

5 个答案:

答案 0 :(得分:3)

private中的class iterstack: private vector<value_type>表示vector<value_type>是私有基类。默认情况下,类的基类是私有的,因此在这种情况下添加的private关键字无效。如果基类是私有的,则其公共和受保护的接口将作为私有函数等添加到派生类中。

class Base {
    public:
    void fun(){}
};
class Derived1 : public Base { };  //fun() is public member function
class Derived2 : Base{}; //fun() is private
class Derived3 : private Base {}; //fun is private
class Derived4 : private Base {
    public:
    using Base::fun; //fun is public
}

using vector<value_type>::crbegin;使用crbegin中私有的公共成员函数iterstack(因为它来自使用private关键字继承的基类)public 1}}。

答案 1 :(得分:2)

您只是从private继承vector。其中基类是vector,派生类是iterstack

接下来你要做的就是在crbegin中公开iterstack

答案 2 :(得分:2)

  

class iterstack: vector<value_type>(没有私人关键字)

之上的差异是什么?

没有区别。在使用class关键字(而不是struct)定义的类中,默认情况下继承是私有的;因此,无论您是否明确说出(如代码所示)或保留private关键字,它都是私密的。

  

我真的不明白这一行。 using关键字

这是使用声明,它在当前范围内提供单个名称。它在这里用来使(私有)基类的名称可用作该类的成员。

  

我经常以这种形式使用:using namespace std

这是一个 using指令,它将命名空间的全部内容转储到当前作用域中。如果你经常使用using namespace std将标准库转储到全局命名空间中,那么这是一个你应该摆脱的坏习惯;它会使用许多不需要的名称来污染命名空间,这可能会与程序想要使用的名称冲突。命名空间存在是有充分理由的 - 使用它们。

答案 3 :(得分:1)

你的第一个问题是关于私人继承。使用private关键字继承,与class iterstack: private vector<value_type>一样,实质上是因为该类继承自仅vector<value_type>知道的iterstack。也就是说,它继承自vector<value_type>,并且可以在内部使用vector<value_type>的所有功能,但程序的其余部分并不知道它继承自vector<value_type>,因此可以' t将其视为vector<value_type>类型的对象,就像在class iterstack: public vector<value_type>中一样。您可以在此处找到有关私有继承的更多信息:Difference between private, public, and protected inheritance

您的第二个问题是关于usingusing vector<value_type>::crbegin;关键字的使用情况。在此上下文中,单词using具有从crbegin成为该类公共成员的vector<value_type>的效果。它本质上与using namespace std;做同样的事情,除了不将std命名空间中的所有名称引入函数的命名空间,它从{{1引入特定名称crbegin进入类的命名空间,这样可以使它成为类的公共成员。您可以在此处找到有关vector<value_type>声明的多种用途的更多信息:http://en.cppreference.com/w/cpp/language/using_declaration

答案 4 :(得分:0)

private关键字将超类向量声明为私有,因此您无法更改超类。