我正在阅读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
另一种使用方式让我感到困惑。
请告诉我上面两点的含义。
谢谢:)
答案 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
您的第二个问题是关于using
中using 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关键字将超类向量声明为私有,因此您无法更改超类。