C 語言物件導向程式設計 繼承

2021-10-01 03:22:45 字數 4002 閱讀 4134

繼承就是基於乙個已有的類(一般稱作父類或基類),再去重新宣告或建立乙個新的類,這個類可以稱為子類或派生類。子類或派生類可以訪問父類的資料和函式,然後子類裡面又新增了自己的屬性和資料。在 c 語言裡面,可以通過結構體巢狀的方式去實現類的單繼承(暫不考慮多重繼承),但有一點注意事項,就是在結構體巢狀時,父類物件需要放在結構體成員的第乙個位置。

標頭檔案 coordinate.h 

#ifndef __coordinate_h_

#define __coordinate_h_

//宣告乙個位置類,屬性為座標x,y,提供屬性操作函式

typedef struct coordinate coordinate_t,*p_coordinate_t;

extern void coordinate_init(p_coordinate_t p_coordinate,short int x,short int y);

extern void coordinate_uninit(p_coordinate_t p_coordinate);

#endif // !__coordinate_h_

在標頭檔案 coordinate.h 裡,宣告乙個位置類,類裡面提供了座標屬性 x 和 y,還提供了屬性的操作函式指標。標頭檔案對外提供 coordinate_init 和 coordinate_uninit 兩個函式,用來初始化物件和解除初始化。

原始檔 coordinate.c 

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "inc/coordinate.h"

//修改 coordinate 的屬性值

static void coordinate_moveby(struct coordinate *p_coordiante,short int dx,short int dy)

}//獲取coordinate的屬性值x

static short int coordinate_get_x(struct coordinate *p_coordiante)

//獲取coordinate的屬性值y

static short int coordinate_get_y(struct coordinate *p_coordiante)

//建立乙個coordinate物件

void coordinate_init(p_coordinate_t p_coordinate,short int x,short int y)

p_coordinate->x = x;

p_coordinate->y = y;

p_coordinate->moveby = coordinate_moveby;

p_coordinate->get_x = coordinate_get_x;

p_coordinate->get_y = coordinate_get_y;

}//銷毀乙個coordinate物件

void coordinate_uninit(p_coordinate_t p_coordinate)

}

在原始檔 coordinate.c 裡,屬性的操作函式都使用 static 進行宣告,不允許外部呼叫。在函式 coordinate_init 中,主要進行了屬性賦值,並註冊操作函式指標,後面可以直接通過函式指標對操作函式進行呼叫。在函式 coordinate_uninit 中,主要是清除各個屬性的賦值。

至此,整個父類 coordinate 修改完成,父類把屬性和屬性的操作函式都封裝在結構體內,其封裝程度已經比較高,外部不能直接呼叫父類的屬性操作函式,必須通過函式指標的方式進行呼叫。

接下來,我們基於父類 coordinate ,重新宣告乙個子類 rectangle ,子類在標頭檔案中的宣告,如下所示:

標頭檔案 rectangle.h 

#ifndef __rectangle_h_

#define __rectangle_h_

#include "coordinate.h" //包含基類的介面

//宣告乙個rectangle類,繼承coordinate類

typedef struct rectangle rectangle_t,*p_rectangle_t;

extern p_rectangle_t rectangle_create(short int x,short int y,unsigned short width,unsigned short height);

extern void rectangle_destroy(p_rectangle_t p_rectangle);

extern void rectangle_test_function(void);

#endif // !__rectangle_h_

原始檔 rectangle.c 

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "inc/rectangle.h"

//建立乙個rectangle類物件

p_rectangle_t rectangle_create(short int x,short int y,unsigned short width,unsigned short height)

else

return p_rectangle;

}//銷毀乙個rectangle類物件

void rectangle_destroy(p_rectangle_t p_rectangle)

}

在標頭檔案 rectangle.h 裡面,通過include包含了父類coordinate的介面,並建立了乙個新的結構體,用於宣告乙個 rectangle 類,這個結構體把父類 coordinate 放在了第乙個成員的位置,同時新增了自己的兩個屬性,寬度width和高度height。

在原始檔rectangle.c 裡面,rectangle_create 函式用於建立乙個 p_rectangle_t 型別的物件,並為其分配記憶體空間。分配成功後,對呼叫父類 coordinate_init函式,對父類的各種屬性進行初始化,並同時對自身的屬性 width 和 height 進行初始化,最後返回建立成功後的物件指標。

rectangle_destroy 用於父類物件屬性的解除初始化,並為物件屬性重新分配預設值,釋放之前申請的記憶體空間,銷毀 rectangle 物件。

從頭檔案 rectangle.h 和原始檔 rectangle.c 可以看出,子類 rectangle 是基於其父類 coordinate 進行宣告和構建的,因為矩形rectangle除了 width 和 height 屬性外,還包含了座標 x 和 y 屬性。

把父類放在結構體成員的第乙個位置,是由於結構體內存的連續性,可以很安全地進行強制型別轉換。舉個例子:假如乙個函式要求傳入的引數是 coordinate_t 型別,但可以通過強制型別轉換,傳入 rectangle_t 型別的引數,具體的使用方法,可以檢視以下測試函式。

void rectangle_test_function(void)

//銷毀類物件

rectangle_destroy(p_rectangle_1);

rectangle_destroy(p_rectangle_2);

}

測試函式的執行效果,如下圖所示:

通過上述**的測試,可以總結出以下幾點內容:

1、外部函式可以通過子類直接使用父類的各個成員,但只能通過子類結構體的第乙個成員來訪問。

2、父類放在子類結構體的第乙個位置,由於結構體內存的連續性,因此可以通過強制型別轉換來直接訪問。

3、由於c語言結構體的特性,即使子類存在與父類同名的函式,父類的函式不會被子類的函式覆蓋和重寫,因此,子類與父類之間不存在函式過載。

物件導向程式設計 繼承(C )

1 繼承是軟體重用的一種方式,程式設計師通過繼承,可以吸收現有類的資料和行為來建立新類。2 幾個概念 1 直接基類 現有的類稱為基類,派生類可以由基類繼承而來。2 間接基類 通過兩級或更多級類層次繼承的類 3 單繼承 派生類由繼承乙個基類而得到。4 多繼承 派生類由多個類繼承而來。3 三種繼承方式 ...

物件導向程式設計 繼承

繼承是物件導向程式設計的主要特點之一。繼承,顧名思義就是子繼承父的所有。在面向程式設計中繼承的意思並沒變,子類繼承父類所擁有的屬性 方法。使用extends關鍵字使子類繼承父類,子類就可以自動復用父類的方法了 私有方法除外 並且繼承了父類的所有屬性。在子類例項化過程中子類的構造方法一定會去呼叫父類的...

物件導向程式設計 繼承

一 簡介 1 繼承是軟體復用的一種方式,通過繼承,可以吸收現有類的資料和行為來建立新類,並增添新的效能增類。2 派生類顯示繼承的基類稱為直接基類,經兩級或者多級類層次繼承的類稱為間接基類。3 繼承的方式 public private protected 4 派生類一般不能直接訪問基類的private...