受Felix牛启发,用vector实现了一个stack模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <iostream> #include <vector> #include <cassert> using namespace std; template <class T> class mstack: private vector<T> //~ 私有继承自vector<T> :) { public: mstack(size_t = 0); //~ 接口声明 :) void push(const T &); void pop(); T& top(); void clear(); size_t size() const; bool empty() const; }; //~ 接口实现 :) template <class T> mstack<T>::mstack(size_t _size) { if(_size) vector<T>::reserve(_size); } template <class T> void mstack<T>::push(const T &t) { vector<T>::push_back(t); } template <class T> void mstack<T>::pop() { assert(vector<T>::size() > 0); vector<T>::erase(vector<T>::end()-1); } template <class T> T& mstack<T>::top() { return *(vector<T>::end() - 1); } template <class T> void mstack<T>::clear() { vector<T>::clear(); } template <class T> size_t mstack<T>::size()const { return vector<T>::size(); } template <class T> bool mstack<T>::empty()const { return vector<T>::size() == 0; } //~ 测试代码 :) int main() { mstack<int> stk; for(int i = 0; i < 10; ++i) stk.push(i); stk.push(100); cout<<stk.top()<<endl; stk.pop(); cout<<stk.top()<<endl; cout<<stk.size()<<endl; stk.clear(); cout<<stk.size()<<endl; //~ cout<<stk.capacity()<<endl; private inherit from vector<T> :( return 0; } |
有一点需要注意的是,由于STL内的容器的析构函数都不是virtual的,所以,继承这些容器的类(或者模板类)不能用于多态!这也是不提倡继承STL容器的原因。
不过,由于上面的代码中mstack
继承vector的目的不是使用多态特性,仅仅是复用了vector的接口而已,且复用也仅仅是内部复用;
由于是私有继承,你无法调用父类vector的接口,子类与父类接口并不一致,在语法就不能用于多态;
综上所述,这样的继承并没有什么潜在的危险。
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
阅毕
赞~
突然想起来STL里面是用protected继承的噢。。
呃……我对STL源码不了解,不知道里面各成员的具体含义,用protected和private就没啥区别了吧!