文章目录

  • 前言
  • 封装
    • C++实现
    • C 实现
  • 继承
    • C++ 实现
    • C实现

前言

为了保证代码的可复用性、可扩展性、可维护性,我们提出了面向对象的思想。
面向对象的核心特性有以下几个

  • 封装特性
    信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。
    封装用来提升代码的可扩展性、可维护性
  • 继承特性
    继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类。为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持。继承主要是用来解决代码可复用性的问题
  • 多态特性
    多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
    多态可以提高代码的可扩展性和可复用性

C++提供语法来实现以上三个特性,而C语言则可以使用函数指针来实现以上三个特性。

封装

C++实现

class Person{private:char *pFName;char *pLName;
public:Person(const char * const str1,const char * const \str2):pFName(str1),pLNname(str2){}~Person();void Person_DisplayInfo();void Person_WriteToFile(const char* pFileName);
}void Person::Person_DisplayInfo()
{cout <<"pFName is " << this->pFName<< endl;cout <<"pLName is " << this -> pLName << endl;
}void Person::Person_WriteToFile(const char* pFileName)
{if(!pFileName) {cout <<"file name is null" << endl;return;}FILE *fp;printf("write ot file name is: %s\n",pFileName);fp = fopen(pFileName, "a+");char *buff = NULL;buff = (char *)malloc(sizeof(DATA_SIZE));if(!buff) {printf("malloc failed\n");return;}int count;strcpy(buff,this->pFName);count = fwrite(buff,sizeof(char),strlen(buff),fp);printf("write to %s's result is %d \n",pFileName,count);fclose(fp);fp = NULL;
}int main()
{Person obj("lili","chuchu");obj.Person_DisplayInfo();obj.Person_WriteToFile("test.txt");return 0;
}

C 实现

person.h

#include <stdio.h>
#include <stdlib.h>typedef struct _Person Person;//declaration of pointers to functions
typedef void    (*fptrDisplayInfo)(Person*);
typedef void    (*fptrWriteToFile)( Person*, const char*);
typedef void    (*fptrDelete)( Person *) ;typedef struct _Person {char* pFName;char* pLName;//interface for functionfptrDisplayInfo   Display;fptrWriteToFile   WriteToFile;fptrDelete      Delete;
}Person;Person* new_Person(const char* const pFirstName, const char* const pLastName); //constructorvoid delete_Person(Person* const pPersonObj);    //destructorvoid Person_DisplayInfo(Person* const pPersonObj);
void Person_WriteToFile(Person* const pPersonObj, const char* pFileName);

person.c

#include <stdio.h>
#include <stdlib.h>
#include "person.h"#define DATA_SIZE 1024 Person* new_person(const char* const pFirstName, const char* const pLastName)
{Person *obj = NULL;obj = (Person *)malloc(sizeof(Person));if(!obj){return NULL;}obj -> pFName =  malloc(sizeof(char)*(strlen(pFirstName)+1));if(!obj -> pFName) {return NULL;}strcpy(obj -> pFName, pFirstName);obj -> pLName = malloc(sizeof(char) * (strlen(pLastName) + 1));if(!obj -> pLName) {return NULL;}strcpy(obj -> pLName, pLastName);/*construct the function pointer*/obj->Delete = delete_Person;obj->Display = Person_DisplayInfo;obj->WriteToFile = Person_WriteToFile;printf("finish constructor Person\n");return obj;
}void Person_WriteToFile(Person* const pPersonObj, const char* pFileName)
{if(!pPersonObj || !pFileName) {return;}FILE *fp;printf("write ot file name is: %s\n",pFileName);fp = fopen(pFileName, "a+");char *buff = NULL;buff = (char *)malloc(sizeof(DATA_SIZE));if(!buff) {printf("malloc failed\n");return;}int count;strcpy(buff,pPersonObj->pFName);count = fwrite(buff,sizeof(char),strlen(buff),fp);printf("write to %s's result is %d \n",pFileName,count);fclose(fp);fp = NULL;
}void delete_Person(Person* const pPersonObj)
{if(!pPersonObj) {return;}if(pPersonObj -> pFName) {free(pPersonObj->pFName);pPersonObj -> pFName = NULL;}if(pPersonObj -> pLName) {free(pPersonObj -> pLName);pPersonObj -> pLName = NULL;}}void Person_DisplayInfo(Person* const pPersonObj) {if(!pPersonObj) {printf("obj is not exists, please construct\n");}printf("pFName is %s\n",pPersonObj -> pFName);printf("pLName is %s\n",pPersonObj -> pLName);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "person.h"
//#include "employee.h"int main(int argc, char *argv[]) {Person *obj;obj = new_person("pfirst_name","plast_name");obj -> Display(obj);obj -> WriteToFile(obj,"F:\\test_write.txt");obj -> Delete(obj);return 0;
}

继承

C++ 实现

class Person{private:char *pFName;char *pLName;
public:Person(const char * const str1,const char * const \str2):pFName(str1),pLNname(str2){}~Person(){}void Person_DisplayInfo();void Person_WriteToFile(const char* pFileName);
}class Empolyee:public Person{private:char* pDepartment;char* pCompany;int nSalary;
public:Empolyee(const char * const str1,const char * const\str2,int num):Person(str1,str2),pDepartment(str1),pCompany(str2),nSalary(num){}~Empolyee(){}void Employee_DisplayInfo();
}
void Empolyee::Employee_DisplayInfo()
{Person_DisplayInfo();//可以访问基类的公有成员cout << "pDepartment is " << pDepartment << endl;cout << "pCompany is " << pCompany<< endl;cout << "nSalary is " << nSalary << endl;
}

C实现

person.c如上,person.h增加万能指针void *
person.h

#include <stdio.h>
#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */typedef struct _Person Person;//declaration of pointers to functions
typedef void    (*fptrDisplayInfo)(Person*);
typedef void    (*fptrWriteToFile)( Person*, const char*);
typedef void    (*fptrDelete)( Person *) ;typedef struct _Person {void *pDerivedObj; char* pFName;char* pLName;//interface for functionfptrDisplayInfo   Display;fptrWriteToFile   WriteToFile;fptrDelete      Delete;
}Person;Person* new_Person(const char* const pFirstName, const char* const pLastName); //constructorvoid delete_Person(Person* const pPersonObj);    //destructorvoid Person_DisplayInfo(Person* const pPersonObj);
void Person_WriteToFile(Person* const pPersonObj, const char* pFileName);

employee.h

#include "Person.h"typedef struct _Employee Employee;typedef struct _Employee
{Person* pBaseObj;char* pDepartment;char* pCompany;int nSalary;//If there is any employee specific functions; add interface here.}Employee;Person* new_Employee(const char* const pFirstName, const char* const pLastName,const char* const pDepartment, const char* const pCompany, int nSalary);    //constructor
void delete_Employee(Person* const pPersonObj);    //destructorvoid Employee_DisplayInfo(Person* const pPersonObj);

employee.c

#include <stdio.h>
#include <stdlib.h>#include "employee.h"Person* new_Employee(const char* const pFirstName, const char* const pLastName,const char* const pDepartment, const char* const pCompany, int nSalary)
{Employee* pEmpObj;//calling base class construtorPerson* pObj = new_person(pFirstName, pLastName);//allocating memorypEmpObj = malloc(sizeof(Employee));if (pEmpObj == NULL){pObj->Delete(pObj);return NULL;}pObj->pDerivedObj = pEmpObj; //pointing to derived object//initialising derived class memberspEmpObj->pDepartment = malloc(sizeof(char)*(strlen(pDepartment)+1));if(pEmpObj->pDepartment == NULL){return NULL;}strcpy(pEmpObj->pDepartment, pDepartment);pEmpObj->pCompany = malloc(sizeof(char)*(strlen(pCompany)+1));if(pEmpObj->pCompany== NULL){return NULL;}strcpy(pEmpObj->pCompany, pCompany);pEmpObj->nSalary = nSalary;//Changing base class interface to access derived class functions//virtual destructor//person destructor pointing to destrutor of employeepObj->Delete = delete_Employee;pObj->Display = Employee_DisplayInfo;//pObj->WriteToFile = Employee_WriteToFile;printf("finish construct employee\n");return pObj;
}void delete_Employee(Person* const pPersonObj)
{if(!pPersonObj){return;}Employee* pEmpObj;pEmpObj = pPersonObj->pDerivedObj;if(pEmpObj->pDepartment) {free(pEmpObj->pDepartment);pEmpObj->pDepartment = NULL;}if(pEmpObj->pCompany) {free(pEmpObj->pCompany);pEmpObj->pCompany = NULL;}pPersonObj->Delete(pPersonObj);
}void Employee_DisplayInfo(Person* const pPersonObj) {if(!pPersonObj) {printf("pPersonObj is null\n");return;}Employee* pEmpObj;pEmpObj = pPersonObj->pDerivedObj;printf("pEmpObj's pDepartment is %s\n",pEmpObj->pDepartment);printf("pEmpObj's pCompany is %s\n",pEmpObj->pCompany);printf("pEmpObj's nSalary is %d\n",pEmpObj->nSalary);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "person.h"
//#include "employee.h"int main(int argc, char *argv[]) {Person *obj;obj = new_person("pfirst_name","plast_name");obj -> Display(obj);obj -> WriteToFile(obj,"F:\\test_write.txt");obj -> Delete(obj);Person *pobj;pobj = new_Employee("Gauri", "Jaiswal","HR", "TCS", 40000);pobj -> Display(pobj);pobj -> Delete(pobj);return 0;
}

设计模式 之美 -- 面向对象(C/C++分别实现)相关推荐

  1. 设计模式之美总结(面向对象篇)

    title: 设计模式之美总结(面向对象篇) date: 2022-10-11 17:02:54 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  2. 设计模式一网打尽,40余篇文章带你领略设计模式之美

    文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...

  3. 设计模式之美总结(结构型篇)

    title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  4. 设计模式之美读书笔记

    目录 设计模式之美 读书笔记5- 哪些代码看似面向对象,实际是面向过程编程? 读书笔记4- 封装.抽象.继承.多态分别解决了什么编程问题? 读书笔记3- 我们在讨论面向对象的时候,主要说的是什么? 读 ...

  5. 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...

  6. 设计模式之美总结(设计原则篇)

    title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  7. 设计模式之美总结(创建型篇)

    title: 设计模式之美总结(创建型篇) date: 2022-11-03 13:58:36 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  8. 最新Java设计模式之美

    目录: ┣━━不定期加餐 (3讲) ┃    ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.html ┃    ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.m4a ┃ ...

  9. 设计模式之美---常用创建型模式

    目录 单例模式 如何实现一个单例? 处理资源访问冲突 表示全局唯一类 单例的几种实现方式 实现一个线程唯一的单例模式 实现一个集群环境下的单例 工厂模式 简单工厂 工厂方法 抽象工厂 实现一个DI(D ...

最新文章

  1. 影视中渐隐渐现特点作用_影视配音的技巧
  2. ORACLE TO_CHAR的一个问题
  3. 无法创建 SSIS 运行时对象。请验证 DTS.dll 是否可用及是否已注册。此向导无法继续而将终止。 (SQL
  4. Android基于Docker容器的双系统多开实现和自动化部署
  5. 激动的时刻,终于成啦~
  6. 【ZOJ - 4020 】Traffic Light (bfs,分层图)
  7. 让IT工作者过度劳累的12个坏习惯
  8. mipi协议_MIPI物理层一致性测试:D-PHY一致性测试
  9. NODE安装N管理出错
  10. VC++使用CImage在内存中Bmp转换Jpeg图片
  11. 交互设计精髓之理解输出
  12. 【ftp上传文件失败】put: Access failed: 553 Could not create file. (passwd)(接详细配置1问题解决)
  13. Gmail企业邮箱在用OUTLOK或FOXMAIL有时出现密码错误的解决办法
  14. hackbar工具安装使用教程
  15. 安卓导入项目遇到“Sync Android SDKs”
  16. C标准库头文件—ctype.h
  17. Windows10分屏显示的3种方式
  18. windows版 redis安装教程,以及redis客户端安装
  19. 基于stm32f103c8t6与手机蓝牙控制LED
  20. 关于淘宝的数据库系统

热门文章

  1. 自己动手写简单的web应用服务器(4)—利用socket实现文件的下载
  2. 最长连续子序列nlogn算法
  3. 综合素质计算机能力,教资统考中学《综合素质》:信息处理能力(一)
  4. element ui需要引入样式吗_ElementUI 修改默认样式的几种办法
  5. 在php中_post啥意思,php中$_post什么意思
  6. linux mint 修改dns,如何在Ubuntu和LinuxMint中刷新DNS缓存
  7. 三下乡辅导孩子计算机知识,【青春“三下乡”】普及家庭教育知识,共促孩子健康成长...
  8. canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
  9. 【C++】何时需要自定义拷贝构造函数和赋值符
  10. win7怎么关闭虚拟机服务器,大师教您Win7系统怎么彻底关闭退出vmware虚拟机的处理要领...