广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >用C语言怎么写面向的对象
  • 595
分享到

用C语言怎么写面向的对象

2023-06-17 04:06:08 595人浏览 安东尼
摘要

这篇文章主要讲解了“用C语言怎么写面向的对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用C语言怎么写面向的对象”吧!以下我将用一个工厂类实现具体汽车的生产,奔驰车、宝马车、奥迪车都将通过

这篇文章主要讲解了“用C语言怎么写面向的对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用C语言怎么写面向的对象”吧!

以下我将用一个工厂类实现具体汽车的生产,奔驰车、宝马车、奥迪车都将通过工厂类来生产,由父类指针指向具体的汽车实例:

头文件:

//Car.h  #ifndef CAR_H_  #define CAR_H_  typedef enum CarType_E  {      CAR_TYPE_BENZE = 0,      CAR_TYPE_BMW      ,      CAR_TYPE_AUDI     ,      CAR_TYPE_NONE     ,  }CarType_E;  class BaseCar  {  public:      BaseCar(CarType_E CarType);  virtual ~BaseCar();  virtual void CarSpeaker();      CarType_E _CarType;  };  class BenzeCar : public BaseCar  {  public:      BenzeCar(CarType_E CarType);      ~BenzeCar();  public:  void CarSpeaker();  };  class BMWCar : public BaseCar  {  public:      BMWCar(CarType_E CarType);      ~BMWCar();  void CarSpeaker();  };  class AudiCar : public BaseCar  {  public:      AudiCar(CarType_E CarType);      ~AudiCar();  void CarSpeaker();  };  class CarFactory  {  public:  BaseCar* createNewCar(CarType_E CarType);  };  #endif 

源代码:

//Car.cpp  #include "Car.h"  #include <iOStream>  using namespace std;  BaseCar::BaseCar(CarType_E CarType) : _CarType(CarType)  {  printf("BaseCar create\n");  }  BaseCar::~BaseCar()  {  printf("BaseCar delete\n");  }  void BaseCar::CarSpeaker()  {  std::cout << "BeBu! BeBu" << endl;  }  BenzeCar::BenzeCar(CarType_E CarType) : BaseCar(CarType)  {  printf("BenzeCar create\n");  }  BenzeCar::~BenzeCar()  {  printf("BenzeCar delete\n");  }  void BenzeCar::CarSpeaker()  {  printf("BeBu! BeBu! BenzeCar Car,Type:%d\n", _CarType);  }  BMWCar::BMWCar(CarType_E CarType) : BaseCar(CarType)  {  printf("BMWCar create\n");  }  BMWCar::~BMWCar()  {  printf("BMWCar delete\n");  }  void BMWCar::CarSpeaker()  {  printf("BeBu! BeBu! BMWCar Car,Type:%d\n", _CarType);  }  AudiCar::AudiCar(CarType_E CarType) : BaseCar(CarType)  {  printf("AudiCar create\n");  }  AudiCar::~AudiCar()  {  printf("AudiCar delete\n");  }  void AudiCar::CarSpeaker()  {  printf("BeBu! BeBu! AudiCar Car,Type:%d\n", _CarType);  }  BaseCar* CarFactory::createNewCar(CarType_E CarType)  {      BaseCar* newCar = NULL;  switch(CarType)      {  case CAR_TYPE_BENZE:          {              newCar = new BenzeCar(CAR_TYPE_BENZE);  break;          }  case CAR_TYPE_BMW:          {              newCar = new BMWCar(CAR_TYPE_BMW);  break;          }  case CAR_TYPE_AUDI:          {              newCar = new AudiCar(CAR_TYPE_AUDI);  break;          }  default:          {              newCar = new BaseCar(CAR_TYPE_NONE);  break;          }      }  return newCar;  }

测试代码main.cpp

//main.cpp  #include <iostream>  #include "Car.h"  using namespace std;  int main() {      CarFactory* carFactory = new CarFactory();      BaseCar* newBenzeCar = carFactory->createNewCar(CAR_TYPE_BENZE);      BaseCar* newBMWCar = carFactory->createNewCar(CAR_TYPE_BMW);      BaseCar* newAudiCar = carFactory->createNewCar(CAR_TYPE_AUDI);      newBenzeCar->CarSpeaker();      newBMWCar->CarSpeaker();      newAudiCar->CarSpeaker();  delete newBenzeCar;      newBenzeCar = NULL;  delete newBMWCar;      newBMWCar = NULL;  delete newAudiCar;      newAudiCar = NULL;  delete carFactory;      carFactory = NULL;  return 0;  }

编译后输出:

用C语言怎么写面向的对象

以上便是简单工厂模式的源码示例,现在,我们来聊聊为什么用C语言我们也可以实现这面向对象思维的三大特性:

首先是封装性:c++的封装性就是将抽象类的函数和属性都封装起来,不对外开放,外部要使用这些属性和方法都必须通过一个具体实例对象去访问这些方法和属性,而我们知道,C语言中一旦包含了头文件便可以使用头文件中的函数和变量,其实C语言中也可以用一种方法达到这种效果,那便是使用结构体+函数指针+static,结构体中定义属性和函数指针,static将方法都限制在本模块使用,对外部,通过指针函数的方式访问,如此一来,便可以达到面向对象封装性的实现;

对于继承性:C++ 面向对象的继承是可以继承父类的属性和方法,在子类对象中的内存中是有父类对象的内存的,那么,用C语言来写的话我们完全可以在父类结构体中定义一个父类变量在其中,在使用构造子类的时候同时构造父类,便可以达到继承性的特性;

对于多态性:C++中允许一个父类指针指向子类实体,在这个指针使用方法时,若此方法是虚函数,则执行动作会执行到具体的子类函数中,本质的实现方式是通过一个虚函数指针的方式,由于我们用C语言写面向对象本就是通过函数指针的方式来封装函数,那我们完全可以将结构体父类的变量的函数指针让他指向子类的函数来达到多态的特性。

好了,在你们面前班门弄斧了一番,下面开始具体的代码实现:

头文件:

#ifndef CAR_H_  #define CAR_H_  #include <stdio.h>  #include <stdlib.h>  typedef enum CarType  {      CAR_BENZE = 0,      CAR_BMW,      CAR_AUDI,      CAR_NONE,  }CarType;  typedef struct Base_Car  {      CarType car_type;  void (* speaker)(struct Base_Car* car);  void* parent_car; //point to parent,if no any parent,then make it NULL  }Base_Car;  typedef struct Benze_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }Benze_Car;  typedef struct BMW_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }BMW_Car;  typedef struct Audi_Car  {      Base_Car* car;  void (* speaker)(struct Base_Car* car);  }Audi_Car;  typedef struct Car_Factory  {      Base_Car* (* create_new_car)(CarType car_type);  }Car_Factory;  Car_Factory* new_car_factory();  void delete_car_factory(Car_Factory* car_factory);  Base_Car* new_Base_Car();  Benze_Car* new_benze_Car();  BMW_Car* new_bmw_Car();  Audi_Car* new_audi_Car();  void delete_Base_Car(struct Base_Car* car);  void delete_Benze_Car(struct Benze_Car* car);  void delete_BMW_Car(struct BMW_Car* car);  void delete_Audi_Car(struct Audi_Car* car);  #endif 

源文件:

#include "Car.h"  static void Car_speaker(struct Base_Car* car)   {  printf("this is a car\n");  }  static void Benze_speaker(struct Base_Car* car)   {  printf("this is Benze Car, car type is :%d\n",car->car_type);  }  static void BMW_speaker(struct Base_Car* car)   {  printf("this is BMW Car, car type is :%d\n",car->car_type);  }  static void Audi_speaker(struct Base_Car* car)   {  printf("this is Audi Car, car type is :%d\n",car->car_type);  }  Benze_Car* new_benze_Car()   {      Benze_Car* real_car = (Benze_Car*)malloc(sizeof(Benze_Car));      Base_Car* base_car = new_Base_Car();  printf("Benze_Car create\n");      real_car->car = base_car;      real_car->speaker = Benze_speaker;      base_car->car_type = CAR_BENZE;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  BMW_Car* new_bmw_Car()   {      BMW_Car* real_car = (BMW_Car*)malloc(sizeof(BMW_Car));      Base_Car* base_car = new_Base_Car();  printf("BMW_Car create\n");      base_car->car_type = CAR_BMW;      real_car->car = base_car;      real_car->speaker = BMW_speaker;      base_car->car_type = CAR_BMW;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  Audi_Car* new_audi_Car()   {      Audi_Car* real_car = (Audi_Car*)malloc(sizeof(Audi_Car));      Base_Car* base_car = new_Base_Car();  printf("Audi_Car create\n");      base_car->car_type = CAR_AUDI;      real_car->car = base_car;      real_car->speaker = Audi_speaker;      base_car->car_type = CAR_AUDI;      base_car->parent_car = (void*)real_car;      base_car->speaker = real_car->speaker;  return real_car;  }  Base_Car* new_Base_Car()   {      Base_Car* base_car = (Base_Car*)malloc(sizeof(Base_Car));  printf("BaseCar create\n");      base_car->car_type = CAR_NONE;      base_car->parent_car = NULL;      base_car->speaker = Car_speaker;  return base_car;  }  Base_Car* create_new_Car(CarType car_type)   {      Base_Car* base_car = NULL;  switch(car_type)      {  case CAR_BENZE:          {              Benze_Car* real_car = new_benze_Car();              base_car = real_car->car;  break;          }  case CAR_BMW:          {              BMW_Car* real_car = new_bmw_Car();              base_car = real_car->car;  break;          }  case CAR_AUDI:          {              Audi_Car* real_car = new_audi_Car();              base_car = real_car->car;  break;          }  default:  break;      }  return base_car;  }  void delete_Benze_Car(struct Benze_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("Benze_Car delete\n");  }  void delete_BMW_Car(struct BMW_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("BMW_Car delete\n");  }  void delete_Audi_Car(struct Audi_Car* car)   {  free(car->car);      car->car = NULL;  free(car);  printf("Audi_Car delete\n");  }  void delete_Base_Car(struct Base_Car* car)   {  if(NULL != car->parent_car)      {  switch(car->car_type)          {  case CAR_BENZE:              {                  delete_Benze_Car((Benze_Car*)car->parent_car);                  car = NULL; //base car will be delete in child free function  break;              }  case CAR_BMW:              {                  delete_BMW_Car((BMW_Car*)car->parent_car);                  car = NULL;  break;              }  case CAR_AUDI:              {                  delete_Audi_Car((Audi_Car*)car->parent_car);                  car = NULL;  break;              }  default:  break;          }      }  if(NULL != car)      {  free(car);          car = NULL;      }  printf("Base_Car delete\n");  }  Car_Factory* new_car_factory()   {      Car_Factory* car_factory = (Car_Factory*)malloc(sizeof(Car_Factory));      car_factory->create_new_car = create_new_Car;  return car_factory;  }  void delete_car_factory(Car_Factory* car_factory)   {  free(car_factory);      car_factory = NULL;  }

测试文件main.cpp

#include <stdio.h>  #include "Car.h"  int main()  {      Car_Factory* car_factory = new_car_factory();      Base_Car* benzeCar = car_factory->create_new_car(CAR_BENZE);      Base_Car* bmwCar = car_factory->create_new_car(CAR_BMW);      Base_Car* audiCar = car_factory->create_new_car(CAR_AUDI);      benzeCar->speaker(benzeCar);      bmwCar->speaker(bmwCar);      audiCar->speaker(audiCar);      delete_Base_Car(benzeCar);      benzeCar = NULL;      delete_Base_Car(bmwCar);      bmwCar = NULL;      delete_Base_Car(audiCar);      audiCar = NULL;      delete_car_factory(car_factory);      car_factory = NULL;  return 0;  }

编译后执行:

用C语言怎么写面向的对象

感谢各位的阅读,以上就是“用C语言怎么写面向的对象”的内容了,经过本文的学习后,相信大家对用C语言怎么写面向的对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 用C语言怎么写面向的对象

本文链接: https://www.lsjlt.com/news/287084.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 用C语言怎么写面向的对象
    这篇文章主要讲解了“用C语言怎么写面向的对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用C语言怎么写面向的对象”吧!以下我将用一个工厂类实现具体汽车的生产,奔驰车、宝马车、奥迪车都将通过...
    99+
    2023-06-17
  • C++在非面向对象方面对C语言的扩充
    目录C++在非面向对象方面对C语言的扩充引入命名空间函数重载默认参数常量表达式总结C++在非面向对象方面对C语言的扩充 C++是一种面向对象编程语言,但它也可以作为C语言的扩展语言。...
    99+
    2023-05-19
    C++非面向对象扩充 非面向对象对C语言扩充 C语言扩充
  • 用C语言怎样实现面向对象思想
    本篇内容介绍了“用C语言怎样实现面向对象思想”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1, 基本信息众所周知,C语言是结构化和模块化,面...
    99+
    2023-06-16
  • 使用C语言怎么实现面向对象编程OOP
    本篇文章为大家展示了使用C语言怎么实现面向对象编程OOP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。过程&对象?一个对象就是由或多或少的针对这个对象的过程构成的,当然其中是少不了必要的属性...
    99+
    2023-06-16
  • go语言中的面向对象
    Go语言没有继承、构造函数和析构函数等概念,但是它是面向对象的。 .net中类型系统分为值类型和引用类型,两种转换需要进行装箱和拆箱,都是继承自Object类型 Go语言大多数类型都...
    99+
    2022-11-13
  • C语言面向对象编程中的封装是什么
    这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!...
    99+
    2023-06-29
  • Python面向对象语言的概念
    这篇文章主要讲解了“Python面向对象语言的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python面向对象语言的概念”吧!在我们的程序中,我们都是根据操作数据的函数或语句块来设计程...
    99+
    2023-06-17
  • go语言是面向对象的吗
    这篇文章主要介绍了go语言是面向对象的吗的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言是面向对象的吗文章都会有所收获,下面我们一起来看看吧。go语言既不是面向对象,也不是面向过程,因为Go并没有明显的倾...
    99+
    2023-07-05
  • 详解C语言面向对象编程中的封装
    目录前言一、面向对象基本概念什么是对象?对象与类面向对象的编程方式二、C语言实现面向对象面向对象的三大特征面向对象之封装简介代码实现–基础版代码实现-进阶版总结前言 面向...
    99+
    2022-11-13
  • 如何用C语言实现Python的面向对象的机制
    本篇内容主要讲解“如何用C语言实现Python的面向对象的机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用C语言实现Python的面向对象的机制”吧!本文主要介绍的是如何用C语言实现Py...
    99+
    2023-06-17
  • go语言是不是面向对象的
    小编给大家分享一下go语言是不是面向对象的,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!go语言即不是面向对象,也不是面向过程,因为Golang并没有明显的倾向,而是更倾向于让编程者去考虑该怎么去用它,也许它的特色就是灵活...
    99+
    2023-06-14
  • Python语言的面向对象举例分析
    本篇内容介绍了“Python语言的面向对象举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们需要定义一个新的HTMLParse...
    99+
    2023-06-17
  • java语言是一种面向对象的程序设计语言吗
    java语言是一种面向对象的程序设计语言吗java语言是面向对象的程序设计语言。(相关视频教程分享:java视频教程)支持部分或绝大部分面向对象特性(类和实例、封装性、继承、多态)的语言即可称为基于对象的或面向对象的语言。Java跟C#是目...
    99+
    2021-09-12
    java教程 java 面向对象
  • golang面向对象的写法是什么
    Go语言是一门强调简洁、高效、并发的编程语言,它的面向对象编程方式与其他语言略有不同。以下是一些Golang中实现面向对象编程的常见...
    99+
    2023-10-21
    golang
  • java语言是一种面向对象的适用于什么的程序设计语言
    java语言是一种面向对象的适用于什么的程序设计语言?java语言是一种面向对象的适用于网络环境的软件开发的程序设计语言。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Ja...
    99+
    2019-07-05
    java入门 java
  • Python面向对象的类和对象怎么使用
    这篇文章主要介绍“Python面向对象的类和对象怎么使用”,在日常操作中,相信很多人在Python面向对象的类和对象怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python面向对象的类和对象怎么使用...
    99+
    2023-06-22
  • c语言怎么对文件进行读写
    C语言提供了一组文件操作函数,用于打开、读、写和关闭文件。下面是一个简单的示例,演示了如何对文件进行读写。1. 打开文件:```c#...
    99+
    2023-09-27
    c语言
  • Python3面向对象技术怎么用
    本文小编为大家详细介绍“Python3面向对象技术怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python3面向对象技术怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。面向对象主要有三个特征:封装,...
    99+
    2023-06-27
  • Java Scala面向对象怎么使用
    今天小编给大家分享一下Java Scala面向对象怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Scala...
    99+
    2023-07-06
  • 怎么用C++面向对象实现图书管理系统
    本文小编为大家详细介绍“怎么用C++面向对象实现图书管理系统”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用C++面向对象实现图书管理系统”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.题目:【1】:工作...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作