C语言也有封装,继承和多态你知道吗

C语言也有封装、继承和多态这些面向对象编程的概念,虽然没有C++和Java那样完整的面向对象编程体系,但是使用合适的编码技巧仍然可以实现这些特性。

封装

封装是指将数据和行为组合在一起,形成一个独立的、完整的、不可分割的整体,对外界隐藏对象的内部细节,只对外部暴露公共的接口,使得外部只能通过公共接口访问对象,从而保证对象的安全性、完整性和可靠性。

在C语言中,封装可以通过结构体(struct)来实现。将对象的属性(变量)和行为(函数)放在一个结构体中,定义一些操作这个结构体的函数,外部只能通过这些函数来访问对象,这个结构体就相当于一个类。

例如,下面是一个用结构体封装的简单的日期对象:

typedef struct {
    int year;
    int month;
    int day;
} Date;

Date* createDate(int year, int month, int day) {
    Date* date = malloc(sizeof(Date));
    date->year = year;
    date->month = month;
    date->day = day;
    return date;
}

void printDate(Date* date) {
    printf("%d年%d月%d日\n", date->year, date->month, date->day);
}

在这个例子中,Date结构体是对象的属性,createDate和printDate函数是对象的行为。外部只能通过createDate函数来创建对象,并通过printDate函数来访问对象,保证了对象的封装性和安全性。

继承

继承是一种机制,通过它子类可以继承父类的属性和行为,父类也可以作为子类的一部分被使用。

在C语言中,继承可以通过结构体嵌套来实现。子类结构体嵌套父类结构体,子类可以继承父类的属性,并在自己的结构体中新增或重载父类的函数,从而实现继承。

例如,下面是一个用结构体嵌套实现继承的例子:

typedef struct {
    int x;
} Base;

typedef struct {
    Base base;
    int y;
} Derived;

void printBase(Base* b) {
    printf("Base.x = %d\n", b->x);
}

void printDerived(Derived* d) {
    printf("Derived.x = %d, Derived.y = %d\n", d->base.x, d->y);
}

int main() {
    Derived d = {{1}, 2};
    printBase((Base*)&d);    // 父类指针指向子类对象
    printDerived(&d);
    return 0;
}

在这个例子中,Base结构体表示父类,Derived结构体嵌套Base结构体表示子类,Derived结构体新增了属性y并重载了printBase函数。在main函数中,我们通过父类指针指向子类对象,并调用printBase和printDerived函数输出结果。

多态

多态是指同一种类型的对象,在不同的情况下具有不同的行为,即“一种表现形式,多种实现方式”。

在C语言中,多态可以通过函数指针来实现。定义一个参数相同的函数指针,不同的函数对应不同的行为,通过调用不同的函数来实现多态。

例如,下面是一个用函数指针实现多态的例子:

typedef struct {
    void (*speak)(void);
} Animal;

void dogSpeak(void) {
    printf("dog bark!\n");
}

void catSpeak(void) {
    printf("cat meow!\n");
}

void speak(Animal* animal) {
    animal->speak();
}

int main() {
    Animal dog = {dogSpeak};
    Animal cat = {catSpeak};
    speak(&dog);
    speak(&cat);
    return 0;
}

在这个例子中,Animal结构体表示动物,speak函数指针表示动物的叫声行为,dogSpeak和catSpeak函数分别表示狗和猫的叫声行为。在main函数中,我们通过speak函数指针实现了多态,输出结果是“dog bark!”和“cat meow!”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言也有封装,继承和多态你知道吗 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 操作系统是什么?

    操作系统是什么? 操作系统(Operating System,简称OS)是一种系统软件,是计算机硬件和应用程序之间的桥梁,是计算机系统中最基本、最重要的软件之一。操作系统可以管理计算机的硬件(如CPU、内存、硬盘、键盘、鼠标、显示器等),运行应用程序,以及为用户提供操作界面。它也是计算机系统一级软件(firmware)之上的第一层系统软件,其他软件都是建立在…

    其他 2023年4月16日
    00
  • Java反射之深入理解

    Java反射之深入理解 什么是Java反射 Java反射是指在运行时检查、获取和修改Java语言中的对象的机制。通过反射,程序可以访问它不知道的、隐藏的、或者乃至于私有的成员变量、方法、内部类等,而这种访问是在Java源代码编译时期是无法预知的。 反射的优缺点 反射机制允许我们在运行时分析类、接口、方法、属性等信息,这可以使代码更加灵活和可扩展。反射机制的优…

    other 2023年6月27日
    00
  • 斗鱼账号绑定手机号以后能解除绑定吗?

    当您在斗鱼上绑定您的手机号的时候,您需要通过验证码来进行验证,这是为了保证您的账号安全性。但一旦您的手机号码被绑定,想要解除绑定就需要了解一些操作步骤。 解除手机号绑定需要注意以下几点: 不能在解除绑定后24小时内重新绑定; 当前手机是否绑定了其他账号,如果是,则无法解除; 当前账号是否有被冻结或违反规定,若冻结或有违规行为,则无法解除; 解除绑定的手机号将…

    other 2023年6月27日
    00
  • 图文详解Linux服务器搭建JDK环境

    图文详解Linux服务器搭建JDK环境 在Linux服务器上搭建Java Development Kit (JDK)环境是开发Java应用程序的必要步骤。下面是在Ubuntu Linux操作系统上完整地搭建JDK环境的攻略。 步骤1:安装Java软件包管理器 在Ubuntu系统上,Java软件包管理器(PPA)可以帮助我们方便地安装和管理JDK。首先,我们需…

    other 2023年6月27日
    00
  • windows-services-使用pscp.exe时跳过主机检查

    以下是关于在Windows服务中使用pscp.exe时跳过主机检查的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 Windows服务是在后台运行的应用程序,可以在操作系统中自动启动和停止。pscp.exe是PuTTY工具集中的一个命令行工具,用于在Windows和Linux之间传输文件。在Windows服务中使用pscp.exe时,可能会遇到主机…

    other 2023年5月8日
    00
  • Win10系统无法开机提示您的电脑遇到问题需要重新启动的原因及解决方法

    Win10系统无法开机提示您的电脑遇到问题需要重新启动的原因及解决方法 原因分析 当 Win10 系统无法开机时,系统会提示“您的电脑遇到问题,需要重新启动”等错误信息。这通常是由于以下原因导致: 系统更新失败或更新后出现兼容性问题; 系统启动时出现了各种驱动程序问题; 系统文件被破坏,例如磁盘错误或电源故障等。 解决方法 方法一:修复启动模式 启动电脑,按…

    other 2023年6月27日
    00
  • Windows WMIC命令使用详解(附实例)

    Windows WMIC命令使用详解(附实例) 一、WMIC命令是什么? WMIC 全称是 Windows Management Instrumentation Command,是一个命令行工具,用于控制本地或远程计算机的系统管理资源(如进程、服务、事件日志等)。可以获取、查询、配置和管理各种资源。 二、WMIC命令的使用方法 1. WMIC命令的基本语法 …

    other 2023年6月26日
    00
  • C/C++ Qt TreeWidget 嵌套节点操作使用

    C/C++ Qt TreeWidget 嵌套节点操作使用攻略 1. 概述 TreeWidget是Qt框架中用于显示树形结构数据的控件,它可以包含多个节点,每个节点可以有子节点。本攻略将详细介绍如何在C/C++中使用Qt的TreeWidget控件进行嵌套节点的操作。 2. 添加节点 要添加一个节点到TreeWidget中,可以使用QTreeWidgetItem…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部