日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言】C语言实现面向对象编程之继承

發布時間:2024/4/24 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言】C语言实现面向对象编程之继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 利用結構體包含實現繼承功能
    • 03. 利用私有指針實現繼承功能
    • 04. 總結
    • 05. 附錄

01. 概述

面向對象編程具有封裝性、繼承性、多態性三個基本特性。使用C語言可以實現基于對象的編程。在基于對象編程實現封裝的基礎之上,我們接下來實現面向對象編程中的繼承部分功能。這種繼承特性知識實現部分面向對象編程中繼承功能。本博客中我們介紹兩種方式的實現繼承。第一種是利用數據結構的包含實現繼承功能,第二種是利用私有指針實現繼承功能,它們提供的接口是完全一致的,只是在實現方式上略有不同。

02. 利用結構體包含實現繼承功能

在C語言的基于對象編程方面,可以利用結構體包含的擴展實現一定的繼承性。下面實現定義一個Student結構,它實現了對Person結構的擴展。

接口文件test.h聲明如下

#ifndef __TEST_H__ #define __TEST_H__#ifdef __cplusplus //表示是C語言的頭文件 extern "C" { #endiftypedef void * HPERSON;//創建對象 HPERSON createPerson(const char *name);//設置對象 void setPerson(HPERSON person, int age, int id);//顯示對象 void displayPerson(HPERSON person);//刪除對象 void deletePerson(HPERSON person);#ifdef __cplusplus } #endif//-----------------STUDENT----------------- typedef void* HSTUDENT;//創建對象 HSTUDENT createStudent(const char *name);//設置對象 void setStudent(HSTUDENT student, int age, int id, int score);//顯示對象 void displayStudent(HSTUDENT student);//刪除對象 void deleteStudent(HSTUDENT student);#endif /*__TEST_H__*/

實現文件test.c如下

#define _CRT_SECURE_NO_WARNINGS #include "test.h" #include <stdio.h> #include <stdlib.h> #include <string.h>//Person表示HPERSON句柄指向的結構體 typedef struct _Person {//使用指針char *name;int age;int id; }Person;//創建對象 HPERSON createPerson(const char * name) {Person *p = NULL;printf("創建對象\n");p = malloc(sizeof(Person));if (NULL == p){printf("分配內存失敗\n");return NULL;}memset(p, 0, sizeof(Person));p->name = malloc(strlen(name) + 1);if (NULL == p->name){printf("分配內存失敗\n");return NULL;}strcpy(p->name, name);p->age = 0;p->id = 0;return p; }//設置對象 void setPerson(HPERSON person, int age, int id) {Person *p = person;if (NULL != p){p->age = age;p->id = id;} }//顯示對象 void displayPerson(HPERSON person) {Person *p = person;if (NULL == p){printf("displayPerson 參數非法\n");return;}printf("Name: %s age: %d id:%d\n", p->name, p->age, p->id); }//刪除對象 void deletePerson(HPERSON person) {Person *p = person;if (NULL == person){return;}if (NULL != p->name){free(p->name);}free(person); }//---------------------STUDENT--------------------typedef struct _stu_t {Person person;int score; }Student;//創建對象 HSTUDENT createStudent(const char *name) {Student *s = malloc(sizeof(Student));if (NULL == s){return NULL;}memset(s, 0, sizeof(Student));s->person.name = malloc(strlen(name) + 1);if (NULL == s->person.name){return;}memset(s->person.name, 0, strlen(name) + 1);strcpy(s->person.name, name);s->score = 0;return s; }//設置對象 void setStudent(HSTUDENT student, int age, int id, int score) {Student *s = student;if (NULL == s){return;}setPerson(&(s->person), age, id);s->score = score; }//顯示對象 void displayStudent(HSTUDENT student) {Student *s = student;if (NULL == s){return;}displayPerson(&(s->person));printf("Student Score: %d\n", s->score); }//刪除對象 void deleteStudent(HSTUDENT student) {Student *s = student;if (NULL == s){return;}if (NULL != s->person.name){free(s->person.name);}free(s);}

測試文件實現如下

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include "test.h"int main() {HSTUDENT s = createStudent("李明");setStudent(s, 12, 1, 99);displayStudent(s);deleteStudent(s);system("pause");return 0; }

測試結果

Name: 李明 age: 12 id:1 Student Score: 99 請按任意鍵繼續. . .

03. 利用私有指針實現繼承功能

在C語言基于對象編程的繼承問題上,通常還可以利用私有的指針實現繼承。

test.h聲明如下

#ifndef __TEST_H__ #define __TEST_H__#ifdef __cplusplus //表示是C語言的頭文件 extern "C" { #endiftypedef void * HPERSON;//創建對象 HPERSON createPerson(const char *name);//設置對象 void setPerson(HPERSON person, int age, int id);//顯示對象 void displayPerson(HPERSON person);//刪除對象 void deletePerson(HPERSON person);#ifdef __cplusplus } #endif//-----------------STUDENT----------------- typedef void* HSTUDENT;//創建對象 HSTUDENT createStudent(const char *name);//設置對象 void setStudent(HSTUDENT student, int age, int id, int score);//顯示對象 void displayStudent(HSTUDENT student);//刪除對象 void deleteStudent(HSTUDENT student);#endif /*__TEST_H__*/

test.c實現如下

#define _CRT_SECURE_NO_WARNINGS #include "test.h" #include <stdio.h> #include <stdlib.h> #include <string.h>//Person表示HPERSON句柄指向的結構體 typedef struct _Person {//使用指針char *name;int age;int id;void *priv; }Person;//創建對象 HPERSON createPerson(const char * name) {Person *p = NULL;printf("創建對象\n");p = malloc(sizeof(Person));if (NULL == p){printf("分配內存失敗\n");return NULL;}memset(p, 0, sizeof(Person));p->name = malloc(strlen(name) + 1);if (NULL == p->name){printf("分配內存失敗\n");return NULL;}strcpy(p->name, name);p->age = 0;p->id = 0;//私有數據初始化p->priv = NULL;return p; }//設置對象 void setPerson(HPERSON person, int age, int id) {Person *p = person;if (NULL != p){p->age = age;p->id = id;} }//顯示對象 void displayPerson(HPERSON person) {Person *p = person;if (NULL == p){printf("displayPerson 參數非法\n");return;}printf("Name: %s age: %d id:%d\n", p->name, p->age, p->id); }//刪除對象 void deletePerson(HPERSON person) {Person *p = person;if (NULL == person){return;}if (NULL != p->name){free(p->name);}free(person); }//---------------------STUDENT--------------------typedef struct _stu_t {int score; }StudentPriv;//創建對象 HSTUDENT createStudent(const char *name) {Person *p = NULL;p = malloc(sizeof(Person));if (NULL == p){printf("分配內存失敗\n");return NULL;}memset(p, 0, sizeof(Person));p->name = malloc(strlen(name) + 1);if (NULL == p->name){printf("分配內存失敗\n");return NULL;}strcpy(p->name, name);p->age = 0;p->id = 0;//創建Student的私有數據p->priv = malloc(sizeof(StudentPriv));if (NULL == p->priv){printf("分配內存失敗\n");return NULL;}((StudentPriv*)p->priv)->score = 0;return p; }//設置對象 void setStudent(HSTUDENT student, int age, int id, int score) {Person *s = student;if (NULL == s){return;}setPerson(s, age, id);((StudentPriv*)s->priv)->score = score; }//顯示對象 void displayStudent(HSTUDENT student) {Person *s = student;if (NULL == s){return;}displayPerson(s);printf("Student Score: %d\n", ((StudentPriv*)s->priv)->score); }//刪除對象 void deleteStudent(HSTUDENT student) {Person *s = student;if (NULL == s){return;}if (NULL != s->name){free(s->name);}free(s);}

測試程序main.c實現如下

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include "test.h"int main() {HSTUDENT s = createStudent("李明");setStudent(s, 12, 1, 99);displayStudent(s);deleteStudent(s);system("pause");return 0; }

測試結果

Name: 李明 age: 12 id:1 Student Score: 99 請按任意鍵繼續. . .

04. 總結

C語言可以實現部分繼承功能。實現對象的繼承利用的是C語言編譯后的內存布局。這種繼承方式可以實現將擴展對象的句柄傳遞給基本對象。由于內存布局的特點,C語言基于對象的編程無法無法實現多重繼承。

由于程序中需要隱藏細節,這種繼承只能在下層的程序中定義,而很難從在調用程序中擴展。因此這種C語言所實現的知識基于對象的編程,而不能實現完全的面向對象編程。

總之,使用C語言進行基于對象編程的繼承特性的時候,更多的是在下層提供的接口中,提供多個句柄表示有繼承關系的對象,被繼承者的處理函數可以處理繼承者的句柄。

05. 附錄

代碼下載:C語言實現對象編程之繼承代碼.rar

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【C语言】C语言实现面向对象编程之继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。