继承与多态的应用:通用链表的实现
1.掌握继承与多态
2.掌握纯虚函数与抽象类以及接口的含义
3.通过多态的形式,建立与类型无关的通用链表
<span style="font-size:18px;">#include <iostream>
#include <assert.h>
using namespace std;
class Object
{
public:
Object()
{}
virtual ~Object()
{}
public:
virtual void Print()const = 0; //接口
};
class List;
class ListNode
{
friend class List
public:
ListNode()
{
data = NULL;
next = NULL;
}
ListNode(Object *pobj)
{
data = pobj;
next = NULL;
}
~ListNode()
{
delete data;
}
private:
Object *data; //父类类型作为子类的接口类型
ListNode *next;
};
class List
{
public:
List()
{
Head = Tail = new ListNode;
}
~List()
{
ListNode *p = Head->next;
while(p != NULL)
{
Head->next = p->next;
delete p;
p = Head->next;
}
delete Head;
Head = Tail = NULL;
}
public:
void Push_Back(Object *pb)
{
ListNode *s = new ListNode(p);
assert(s != NULL);
Tail->next = s;
Tail = s;
}
void PrintList()const
{
ListNode *p = Head->next;
while( p != NULL)
{
p->data->Print();
p = p->next;
}
cout<<"Nul."<<endl;
}
private:
ListNode *Head;
ListNode *Tail;
};
1.int类型
class IntObject : public Object
{
public:
IntObject(int d = 0):data(0)
{}
~IntObject()
{
cout<<"Free Int Object"<<endl;
}
public:
void Print()const
{
cout<<data<<"-->";
}
private:
int data;
};
2.string类型
class StringObject : public Object
{
public:
StringObject(const char *str)
{
if(str == NULL)
{
data = new char[1];
data[0] = '\0';
}
else
{
data = new char[strlen(str)+1];
strcpy(data,str);
}
}
~IntObject()
{
delete []data;
data = NULL;
cout<<"Free String Object!"<<endl;
}
public:
void Print()const
{
cout<<"\""<<data<<"\""<<"-->";
}
private:
char *data;
};
int main()
{
List mylist;
for(int i = 1; i <= 5; ++i)
{
IntObject *pi = new IntObject(i);
mylist.Push_Back(pi);
}
mylist.PrintList();
List youlist;
char *str[] = {"xsy","sfds","sdfsf","sfdsfs","sdfsf"};
for(int j = 0; j < 5; ++j)
{
StringObject *ps = new StringObject(str[j]);
youlist.Push_Back(ps);
}
youlist.PrintList();
return 0;
}</span>