`
kmplayer
  • 浏览: 497081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款41:区分inheritance和template

 
阅读更多
1,首先考虑一个问题:
型别T会影响class的行为吗?
如果不影响,你可以使用template.
如果影响,你必须使用虚拟函数,并因而使用继承机制.

2,来看一个模版的实例:
#include <iostream>
using namespace std;

template<class T>
class Stack
{
public:
    Stack();
    void push(const T& t);
    T& pop();
    T& top();
    bool empty();
    int size();
    ~Stack();
private:
    struct StackNode
    {
        StackNode(const T& t, StackNode *nextNode) : data(t),next(nextNode){}
        T data;
        StackNode* next;
    };
    StackNode* head;
    int cnt;
    Stack(const Stack&);
    Stack& operator=(const Stack&);
};

template<class T>
Stack<T>::Stack() : head(NULL),cnt(0) {}

template<class T>
void Stack<T>::push(const T& t)
{
    head = new StackNode(t, head);
    cnt++;
}

template<class T>
T& Stack<T>::pop()
{
    if (!empty())
    {
        StackNode* tmp = head;
        head = head -> next;
        T tmpData = tmp -> data;
        delete tmp;
        cnt--;
        return tmpData;
    }
}

template<class T>
T& Stack<T>::top()
{
    if (!empty())
        return head -> data;
}

template<class T>
bool Stack<T>::empty()
{
    return head == NULL;
}

template<class T>
int Stack<T>::size()
{
    return cnt;
}

template<class T>
Stack<T>::~Stack()
{
    while (head)
    {
        StackNode* tmp = head;
        head = head -> next;
        delete tmp;
    }
}

int main()
{

    Stack<int> myStack;
    myStack.push(20);
    myStack.push(30);
    myStack.push(40);
    cout << myStack.pop() <<endl;
    cout << myStack.size() <<endl;
    cout << myStack.top() <<endl;

    return 0;
}

3,总结:
template用来产生一群class,其中对象型别不会影响class的函数行为.
inheritance用于一群class身上,其中对象型别会影响class的函数行为.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics