C語言實現C++繼承和多型
阿新 • • 發佈:2018-12-30
C++中的多型
我們知道的是在C++中會維護一張虛擬函式表,根據賦值相容規則,我們知道父類的指標或者引用是可以指向子類物件的。如果一個父類的指標或者引用呼叫父類的虛擬函式則該父類的指標會在自己的虛擬函式表中查詢自己的函式地址,如果該父類物件的指標或者引用指向的是子類的物件,而且該子類已經重寫了父類的虛擬函式,則該指標會呼叫子類的已經重寫的虛擬函式。
//c++中的多型 class Base { public: virtual void fun()//虛擬函式實現 { cout << "Base::fun() " << endl; } }; class Derived :public Base { public: virtual void fun()//虛擬函式實現,子類中virtual關鍵字可以沒有 { cout << "Derived::fun() " << endl; } }; void Test1() { Base a;//基類物件 Derived b;//派生類物件 Base* pa = &a;//父類指標指向父類物件 pa->fun();//呼叫父類的函式 pa = &b; //父類指標指向子類物件,多型實現 pa->fun();//呼叫派生類同名函式 }
C語言實現多型
我們知道在C語言中是沒有class類這個概念的,但是有struct結構體,我們可以考慮使用struct來模擬;但是在C語言的結構體內部是沒有成員函式的,如果實現這個父結構體和子結構體共有的函式呢?我們可以考慮使用函式指標來模擬。但是這樣處理存在一個缺陷就是:父子各自的函式指標之間指向的不是類似C++中維護的虛擬函式表而是一塊實體記憶體,如果模擬的函式過多的話就會不容易維護了。
//C實現動態,用到函式指標 typedef void(*FUN)();//重定義一個函式指標型別 struct Base { FUN _f; }; struct Derived { Base _b;//在子類中定義一個基類的物件即可實現對父類的繼承 }; void FunBase() { printf("%s\n", "Base::fun()"); } void FunDerived() { printf("%s\n", "Derived::fun()"); } void Test2() { Base b;//父類物件 Derived d;//子類物件 b._f = FunBase;//父類物件呼叫父類同名函式 d._b._f = FunDerived;//子類呼叫子類的同名函式 Base *pb = &b;//父類指標指向父類物件 pb->_f(); pb = (Base *)&d;//讓父類指標指向子類的物件,由於型別不匹配所以要進行強轉 pb->_f(); }
文章參考自:https://blog.csdn.net/wenqiang1208/article/details/76244628