您好,登錄后才能下訂單哦!
這篇文章主要介紹了c++如何實現多態雙向的功能,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
不采用模板類,而采用虛函數實現多態性,達到通用的目的,data域不存儲任何跟類型有關的信息,而是指針,將數據放于抽象類中,由指針與之建立聯系。
鏈表有頭指針 尾指針,以及之后的一系列插入刪除打印操作,這些函數都寫在鏈表類中。
鏈表指針類型為 鏈表結點類,結點的指針域和 data域,都是指針類型,data域 指向一個抽象類 object對象 。
object類是一個抽象類,當需要鏈表存放整型數據,就具體實現一個存放整型的子類去繼承這個類,必須實現抽象類中的虛函數,以打印函數為例, 每一個不同數據類型的子類都得有自己的打印函數,而object 不關心如何打印。
class intobject :public Object { public: intobject(int d = 0) :data(d) {} ~intobject() {} void Print()const { cout << data << "-->"; } private: int data; }; //////////////////////////////////////////////////////////// class strobject :public Object { public: strobject(char *str) { if (str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[strlen(str) + 1]; strcpy(data, str); } } ~strobject() {} void Print()const { cout << "\"" << data << "\"" << "-->"; } private: char * data; }; //////////////////////////////////////////////////////////// class floatobject :public Object { public: floatobject(float d = 0) :data(d) {} ~floatobject() {} void Print()const { cout << data << "-->"; } private: float data; }; //////////////////////////////////////////////////////////// void main() { list mylist; for (int i = 0; i < 5; ++i) { intobject *pi = new intobject(i); mylist.push_back(pi); } mylist.printlist(); char* arr[5] = { "affd", "fdas", "fdfss", "ere", "qret" }; for (int i = 0; i < 5; i++) { strobject*ps = new strobject(arr[i]); mylist.push_back(ps); } mylist.printlist(); float brr[5] = { 0.34, 54.32, 0.53, 43.2, 5.878 }; for (int i = 0; i < 5; i++) { floatobject*ps = new floatobject(brr[i]); mylist.push_back(ps); } mylist.printlist(); }
鏈表的釋放:
class Object { public: Object() {} virtual ~Object()//因為是虛函數,調動父類析構的 同時 調動子類的析構 {} ////定義接口 通用的打印 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; next = NULL; } private: Object *data; listnode *next; }; class list { public: list() { head = tail = new listnode; } ~list() { listnode *delp = head->next; while (delp!= tail) { head->next = delp->next; delete delp; delp = head->next; } delete head; head = tail = NULL; } void push_back(Object *pb)//尾插 { listnode *s = new listnode(pb); 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 << "NULL" << endl; } private: listnode *head; listnode *tail; }; //////////////////////////////////////////////////////////// class intobject :public Object { public: intobject(int d = 0) :data(d) {} ~intobject() { cout << "delete int" << endl; } void Print()const { cout << data << "-->"; } private: int data; }; //////////////////////////////////////////////////////////// class strobject :public Object { public: strobject(char *str) { if (str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[strlen(str) + 1]; strcpy(data, str); } } ~strobject() { cout << "delete string" << endl; delete []data; data = NULL; } void Print()const { cout << "\"" << data << "\"" << "-->"; } private: char * data; };
感謝你能夠認真閱讀完這篇文章,希望小編分享c++如何實現多態雙向的功能內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。