C語言模式實現C++繼承和多態
-
C語言模式實現C++繼承和多態
描述:
C實現一個struct A和struct B各包含一個int成員a和b,要求達到B繼承了A的效果,也就是B裏麵包含一個A。並且能達
到多態的效果,也就是一個A*p指向A調的是A的函數,指向B調用的是B的函數。
C++中的繼承、多態
繼承是麵向對象複用的重要手段。通過繼承定義一個類,繼承是類型之間的關係建模,共享公有的東西,實現各自本質
不同的東西。
繼承是一種複用手段,在繼承關係裏基類的成員類的成員派生類的成員,由此達到複用的目的。
如果你想學習C/C++可以來這個群,首先是三三零,中間是八五九,最後是七六六,裏麵可以學習和交流,也有學習資料可以可以下載。
所謂多態,其實就是“多種形態”。
C++中虛函數的主要作用就是實現多態。簡單說父類的指針/引用調用重寫的虛函數,當父類指針/引用指向父類對象
時調用的是父類的虛函數,指向子類對象時調用的是子類的虛函數。
- #include <iostream>
- #include <assert.h>
- #include <Windows.h>
- using namespace std;
- //C++中的多態
- class AA
- {
- public:
- virtual void fun1()
- {
- cout << "AA::fun1()" << endl;
- }
- virtual void fun2()
- {
- cout << "AA::fun2()" << endl;
- }
- private:
- int _aa;
- };
- class BB :public AA //公有繼承
- {
- public:
- virtual void fun1() //子類重寫父類的虛函數時,子類的virtual可以不寫
- {
- cout << "BB::fun1()" << endl;
- }
- virtual void fun2()
- {
- cout << "BB::fun2()" << endl;
- }
- private:
- int _bb;
- };
- #include "源.h"
- void Test()
- {
- AA tty;
- BB vvz;
- AA* p = &tty; //父類指針指向父類引用
- p->fun1(); //父類指針指向父類對象
- p->fun2();
- p = &vvz; //父類指針指向子類引用,多態體現
- p->fun1(); //父類指針指向子類對象
- p->fun2();
- }
- int main()
- {
- Test();
- system("pause");
- return 0;
- }
而用C語言又怎樣實現C++的繼承和多態呢?
C語言是一種麵向過程的程序設計語言,而C++是在C語言基礎上衍生來的麵向對象的語言,實際上,很多C++實現的底層是用C語言實現的。
C++在語言級別添加了很多新的機製(封裝、繼承、多態...)。而在C語言中,我們也可以使用這樣的機製,前提是我們需要自己實現。
基本思想:
1.結構體
在C語言中,我們常常把一個對象用結構體進行封裝,這樣便於對對象進行操作,例:
- struct AA
- {
- int a;
- char b;
- }xxy;
- struct AA
- {
- int a;
- char b;
- }xxy;
- struct BB
- {
- int c;
- double q;
- struct AA tty;
- }zzo;
2.函數指針
顧名思義,函數指針就是指向函數的指針,它是一個指針,指向函數的首地址,函數名即為該函數的首地址。
- //Fun函數為一個返回值為char* 的函數
- char* Fun(char* p1, char* p2)
- {
- int i = 0;
- i = strcmp(p1, p2);
- if (i == 0)
- {
- return p1;
- }
- else
- {
- return p2;
- }
- }
- int main()
- {
- char* (*tty)(char* p1, char* p2); //tty為一個函數指針
- tty = &Fun;
- (*tty)("aa", "bb");
- system("pause");
- return 0;
- }
C語言實現繼承、多態
在C語言中,可以利用“結構在內存中的布局與結構的聲明具有一致的順序”這一事實實現繼承。
- //用一個函數指針
- typedef void(*FUN)();
- //父類
- struct AA
- {
- FUN fun;
- };
- //子類
- struct BB
- {
- AA a;
- };
- void FunA()
- {
- printf("AA::fun\n");
- }
- void FunB()
- {
- printf("BB::fun\n");
- }
- void Test()
- {
- AA a;
- BB b;
- a.fun = FunA; //父類對象調用父類函數
- b.a.fun = FunB; //子類對象調用子類函數
- AA* p = &a; //定義一個父類指針指向父類對象
- p->fun(); //調用父類的fun函數
- p = (AA*)&b; //父類指針指向子類對象
- p->fun(); //調用子類的fun函數
- }
- int main()
- {
- Test();
- system("pause");
- return 0;
- }
最後更新:2017-08-13 22:41:10