首页 > 其他分享 >在C语言中实现封装、继承和多态

在C语言中实现封装、继承和多态

时间:2025-01-18 21:32:29浏览次数:3  
标签:封装 get double 多态 C语言 num result 基类 Num

在C语言中,没有直接的支持封装、继承和多态等面向对象特性。C语言是结构化编程语言,通常通过函数和数据结构(结构体)来实现类似的功能。我们可以通过结构体、函数指针、和手动管理的对象生命周期来模拟C++中的面向对象的特性。

下面我们将逐一讨论如何在C语言中实现封装继承多态

1. 封装 (Encapsulation)

封装是指将数据(属性)和操作这些数据的函数(方法)结合在一起,通过接口隐藏内部实现。封装的目的是限制对数据的直接访问,确保数据的安全性和完整性。

在C语言中,封装通常通过结构体和函数来实现。我们可以将数据放入结构体中,并通过提供函数接口来操作这些数据。

示例:封装
#include <stdio.h>

// 定义一个结构体来封装数据
typedef struct {
    double m_a;
    double m_b;
} Num;

// 提供函数接口,操作封装的数据
void set_values(Num* num, double a, double b) {
    num->m_a = a;
    num->m_b = b;
}

double get_sum(Num* num) {
    return num->m_a + num->m_b;
}

void print_values(Num* num) {
    printf("m_a: %.2f, m_b: %.2f\n", num->m_a, num->m_b);
}

int main() {
    Num num;
    set_values(&num, 10, 20);
    print_values(&num);
    printf("Sum: %.2f\n", get_sum(&num));

    return 0;
}
解释:
  • Num 结构体包含了数据 m_am_b,这些数据是封装的。
  • set_valuesget_sum 函数用于访问和操作这些封装的数据。
  • 用户通过调用这些函数来操作数据,外部不能直接访问数据成员,这实现了数据的封装。

2. 继承 (Inheritance)

在C语言中没有类和继承的机制,但我们可以通过结构体嵌套和手动管理函数指针来模拟继承。派生结构体可以包含一个基类结构体作为成员,并通过函数指针来扩展功能。

示例:继承
#include <stdio.h>

// 基类:Num
typedef struct {
    double m_a;
    double m_b;
} Num;

// 基类的函数
void set_values(Num* num, double a, double b) {
    num->m_a = a;
    num->m_b = b;
}

double get_sum(Num* num) {
    return num->m_a + num->m_b;
}

// 派生类:Add
typedef struct {
    Num base;  // 基类
} Add;

// 派生类的函数
double add_getsum(Add* add) {
    return add->base.m_a + add->base.m_b;
}

// 测试
int main() {
    Add add;
    set_values(&add.base, 10, 20);  // 初始化基类成员
    printf("Sum: %.2f\n", add_getsum(&add));  // 访问派生类的函数
    return 0;
}
解释:
  • 基类 Num:包含两个数据成员 m_am_b,以及设置和获取数据的函数。
  • 派生类 Add:通过嵌套一个 Num 结构体来继承基类的成员。
  • 派生类的函数:通过 Add 结构体的 base 成员来访问 Num 类的成员。

这模拟了继承的概念,派生类继承了基类的成员,并可以在派生类中扩展或修改基类的行为。

3. 多态 (Polymorphism)

多态是指相同的操作可以作用于不同类型的对象。通过多态,我们可以在运行时决定调用哪个函数,通常通过虚函数实现。在C语言中,我们可以使用函数指针来模拟多态的行为。

示例:多态
#include <stdio.h>

// 基类:Num
typedef struct {
    double m_a;
    double m_b;
    double (*get_result)(void*);  // 函数指针,用于模拟虚函数
} Num;

// 基类的函数
void set_values(Num* num, double a, double b) {
    num->m_a = a;
    num->m_b = b;
}

// 基类的操作:加法
double add_get_result(void* num) {
    Num* n = (Num*) num;
    return n->m_a + n->m_b;
}

// 派生类:Sub
typedef struct {
    Num base;  // 基类
} Sub;

// 派生类的操作:减法
double sub_get_result(void* num) {
    Num* n = (Num*) num;
    return n->m_a - n->m_b;
}

// 测试函数
void test_polymorphism() {
    Num add = {
  
  {10, 20, add_get_result}};  // 使用基类的加法
    Num sub = {
  
  {10, 20, sub_get_result}};  // 使用派生类的减法

    // 调用多态函数
    printf("Add result: %.2f\n", add.get_result(&add));
    printf("Sub result: %.2f\n", sub.get_result(&sub));
}

int main() {
    test_polymorphism();
    return 0;
}
解释:
  • 基类 Num:包含两个数据成员和一个函数指针 get_result,该指针指向一个函数(模拟虚函数)。
  • 派生类 Sub:继承了基类的成员,并提供了一个新的实现 sub_get_result
  • 多态实现:通过函数指针 get_result,我们可以在运行时绑定不同的函数来实现多态行为。在本例中,add_get_resultsub_get_result 是不同的操作,分别执行加法和减法。

总结:

在C语言中实现面向对象编程的核心思想是通过结构体来表示对象,函数指针来模拟多态,结构体嵌套来模拟继承,函数来访问和操作封装的数据。这种方式虽然不能完全复制C++的面向对象机制,但能够通过巧妙的设计实现类似的功能。

标签:封装,get,double,多态,C语言,num,result,基类,Num
From: https://blog.csdn.net/Hello__nibuhao/article/details/145233026

相关文章

  • C语言知识点
    前言这篇博客并不是我个人所写,是我在网络上无意间看到了markdown版本,我觉得很不错,为了方便我当助班时带的学弟学妹通过我的博客学习C语言,我把这篇文章放在了我的博客里面,便于他们学习。如有侵权,请联系我删除。目录前言第1章程序设计和C语言C语言的发展及其特点结构化......
  • 嵌入式基础 C语言篇 数组.初阶
    一、基本概念逻辑:一次性定义多个相同类型的变量,并存储到一片连续的内存中语法释义:intbuf[5];buf是数组名,即这片连续内存的名称[5]代表这片连续内存总共分成5个相等的格子,每个格子称为数组的元素int代表每个元素的类型,可以是任意基本类型,也可以是组合类型,甚至可以是数组初......
  • 嵌入式基础 C语言篇 指针初阶
    一、指针的入门(1)、预备知识0、图解:1、内存地址字节:字节是内存的容量单位,英文称为byte,一个字节有8位,即1byte(00000000---11111111)=8bits(0---1)地址:系统为了便于区分每一个字节而对它们逐一进行的编号,称为内存地址,简称地址。在32位系统:说明:地址+1就是......
  • 嵌入式基础 C语言篇 错题
    (1) 若已定义x和y为double类型,则表达式x=1,y=x+3/2的值是________。A.1     B.2    C.2.0    D.2.53/2=1;y=2.0(2)简述i++和++i    i++是先使用i的值,再i+1;++i是先i+1,再使用i的值底层原理:1、i++和++i都是带有返回值的函数2......
  • 多项式运算封装
    动态更新。#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;++i)#defineilinline#definergregisterusingnamespacestd;inlineintread(){intw=0,f=1;charch=getchar();while(ch<'0'||......
  • 第1讲:C语言常见概念
    目录1.C语言是什么?2.C语言的历史和辉煌3.编译器的选择VS20224.VS项目和源文件、头文件介绍5.第一个C语言程序6.main函数7.printf和库函数8.关键字介绍9.字符和ASCII编码10.字符串和\011.转义字符12.语句和语句分类13.注释是什么?为什么写注释?正文开始1.C语言......
  • 第2讲:C语言数据类型和变量
    目录1.数据类型介绍2.signed和unsigned3.数据类型的取值范围4.变量5.算术操作符:+、-、*、/、%6.赋值操作符:=和复合赋值7.单目操作符:++、--、+、-8.强制类型转换9.scanf和printf介绍正文开始1.数据类型介绍C语言提供了丰富的数据类型来描述生活中的各种数......
  • 多态
    多态概念:多态:某一个事物,在不同时刻下的不同状态实现多态有3个前提:1、必须要有继承关系2、要有方法的实现3、要有父类的引用指向子类对象1.面向对象三大特征:封装继承多态2.怎么学:a.不要从字面意思上理解多态这两个字,要从使用形式上掌握b.要知道多态的好处c.......
  • C语言中的流程控制(for循环 while循环 do-while循环)
    什么是循环?循环---重复在执行循环语句for while do-while 1. for循环for(表达式1;表达式2;表达式3) {  语句} ①求解表达式1  ②判断表达式2  真 ③执行语句④求解表达式3  重复②-④直到表达式2为假    ①只会执行一次  ......
  • 碳化硅MOS驱动要领、PFC/LLC各种拓扑结构应用及材料封装特性
    碳化硅MOS具有宽带隙、高击穿电场强度、高电流密度、快速开关速度、低导通电阻和抗辐射性能等独特特点,在电子器件领域有着广泛的应用。特别是在电力电子、高温电子、光伏逆变器和高频电子等领域,其性能优势能够提高器件的功率密度、效率和稳定性。碳化硅MOS驱动设计-CSDN创作中......