设计模式 之美 -- 面向对象(C/C++分别实现)
文章目录
- 前言
- 封装
- 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++分别实现)相关推荐
- 设计模式之美总结(面向对象篇)
title: 设计模式之美总结(面向对象篇) date: 2022-10-11 17:02:54 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...
- 设计模式一网打尽,40余篇文章带你领略设计模式之美
文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...
- 设计模式之美总结(结构型篇)
title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...
- 设计模式之美读书笔记
目录 设计模式之美 读书笔记5- 哪些代码看似面向对象,实际是面向过程编程? 读书笔记4- 封装.抽象.继承.多态分别解决了什么编程问题? 读书笔记3- 我们在讨论面向对象的时候,主要说的是什么? 读 ...
- 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们
设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...
- 设计模式之美总结(设计原则篇)
title: 设计模式之美总结(设计原则篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...
- 设计模式之美总结(创建型篇)
title: 设计模式之美总结(创建型篇) date: 2022-11-03 13:58:36 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...
- 最新Java设计模式之美
目录: ┣━━不定期加餐 (3讲) ┃ ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.html ┃ ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.m4a ┃ ...
- 设计模式之美---常用创建型模式
目录 单例模式 如何实现一个单例? 处理资源访问冲突 表示全局唯一类 单例的几种实现方式 实现一个线程唯一的单例模式 实现一个集群环境下的单例 工厂模式 简单工厂 工厂方法 抽象工厂 实现一个DI(D ...
最新文章
- 影视中渐隐渐现特点作用_影视配音的技巧
- ORACLE TO_CHAR的一个问题
- 无法创建 SSIS 运行时对象。请验证 DTS.dll 是否可用及是否已注册。此向导无法继续而将终止。 (SQL
- Android基于Docker容器的双系统多开实现和自动化部署
- 激动的时刻,终于成啦~
- 【ZOJ - 4020 】Traffic Light (bfs,分层图)
- 让IT工作者过度劳累的12个坏习惯
- mipi协议_MIPI物理层一致性测试:D-PHY一致性测试
- NODE安装N管理出错
- VC++使用CImage在内存中Bmp转换Jpeg图片
- 交互设计精髓之理解输出
- 【ftp上传文件失败】put: Access failed: 553 Could not create file. (passwd)(接详细配置1问题解决)
- Gmail企业邮箱在用OUTLOK或FOXMAIL有时出现密码错误的解决办法
- hackbar工具安装使用教程
- 安卓导入项目遇到“Sync Android SDKs”
- C标准库头文件—ctype.h
- Windows10分屏显示的3种方式
- windows版 redis安装教程,以及redis客户端安装
- 基于stm32f103c8t6与手机蓝牙控制LED
- 关于淘宝的数据库系统
热门文章
- 自己动手写简单的web应用服务器(4)—利用socket实现文件的下载
- 最长连续子序列nlogn算法
- 综合素质计算机能力,教资统考中学《综合素质》:信息处理能力(一)
- element ui需要引入样式吗_ElementUI 修改默认样式的几种办法
- 在php中_post啥意思,php中$_post什么意思
- linux mint 修改dns,如何在Ubuntu和LinuxMint中刷新DNS缓存
- 三下乡辅导孩子计算机知识,【青春“三下乡”】普及家庭教育知识,共促孩子健康成长...
- canal同步mysql到kafka_使用Canal同步MySQL数据到Kafka 得到的数据中sql字段无值-问答-阿里云开发者社区-阿里云...
- 【C++】何时需要自定义拷贝构造函数和赋值符
- win7怎么关闭虚拟机服务器,大师教您Win7系统怎么彻底关闭退出vmware虚拟机的处理要领...