我这一个月在课堂上学习了C语言继承和派生
最近一个月的课堂时间,几乎都在和C语言的“继承与派生”死磕。一开始看到这两个词,我满是疑惑——C语言不是面向过程的语言吗?怎么会涉及到面向对象里的概念?深入学习后才明白,原来我们学的是用C语言的结构体和函数指针,模拟实现面向对象的继承与派生思想,这趟学习之旅,可算是收获满满。
在课堂上,老师首先点明了核心:继承的本质是代码复用。当我们需要定义多个具有相同属性和行为的结构体时,不需要重复编写相同的字段和函数,而是可以定义一个“基类”结构体,再让其他“派生类”结构体包含基类结构体,以此实现属性和方法的复用。
我们先定义一个Person基类结构体,包含姓名、年龄属性,以及一个展示信息的函数指针,再编写对应的成员方法,用来输出姓名和年龄信息。当需要定义Student结构体时,不需要再写姓名、年龄这些字段,只需要在Student结构体中嵌入Person结构体,再添加学号、专业这些特有属性即可,这就是派生的过程。
针对Student结构体,我们还需要编写对应的展示方法,在这个方法里,先调用Person结构体的展示函数输出基础信息,再补充输出学号和专业这些子类特有信息。在main函数中完成初始化和函数指针绑定后,调用展示方法,就能同时输出父类和子类的信息,完美体现代码复用的优势。
学习过程中,我也踩了不少坑。比如一开始忘记将派生类对象的父类部分地址传给函数,导致程序运行时出现段错误;还有一次混淆了函数指针的赋值顺序,使得子类无法正确调用父类的方法。后来在老师的指导和同学的讨论下,才慢慢理清逻辑:派生类调用父类方法时,必须传递父类成员的地址,而不是派生类对象的整体地址。
除了基础的继承实现,课堂上还拓展了单继承和多层继承的内容。比如在Student的基础上,再派生一个Graduate研究生结构体,添加研究方向等属性,进一步体会层层复用的便捷性。
这一个月的学习,让我彻底打破了“C语言只能面向过程”的固有认知。原来通过巧妙的代码设计,C语言也能实现面向对象的核心思想。不仅如此,我还深刻理解了“代码复用”的意义——这不仅能减少冗余代码,更能让程序结构更清晰、后期维护更方便。
接下来,我打算尝试用这种思想写一个小型的管理系统,把学到的知识真正运用到实践中去。相信在不断的练习中,我能把继承与派生的知识点掌握得更扎实。
继承与派生
张小明
前端开发工程师
YOLOv8推理可视化结果展示:bus.jpg检测效果惊艳
YOLOv8推理可视化结果展示:bus.jpg检测效果惊艳 在智能城市、自动驾驶和工业自动化快速发展的今天,实时视觉感知能力已成为系统“看得清、反应快”的关键。而目标检测作为计算机视觉的核心任务之一,其算法的精度与效率直接决定了上层应用的成…
提升代码质量:数组和 DataFrame 类型提示
原文:towardsdatascience.com/improving-code-quality-with-array-and-dataframe-type-hints-cac0fb75cc11?sourcecollection_archive---------5-----------------------#2024-09-19 泛型类型规范如何实现强大的静态分析和运行时验证 https://medium.com/flexaton…
我是如何使用聚类来改进分块并构建更好的 RAGs
原文:towardsdatascience.com/improving-rag-chunking-with-clustering-03c1cf41f1cd 当我的句子看起来相隔甚远时,语义分块崩溃了。 当我的句子看起来相隔甚远时,我的第一次语义分块尝试失败了。然而,代理方法在大多数情况下成本…
MATLAB实现:KGE核图嵌入降维算法详解
在图嵌入(Graph Embedding)框架下,许多经典的线性与非线性降维算法(如PCA、LDA、LPP、Isomap等)都可以被统一表述为广义特征值问题。KGE(Kernel Graph Embedding,核图嵌入)正是这一框架的核化扩展,它允许用户在核空间中直接定义亲和图W和约束图D,从而实现高度灵活的核…
YOLOv8能否检测森林冠层郁闭度?碳汇估算支持
YOLOv8能否检测森林冠层郁闭度?碳汇估算支持 在“双碳”目标驱动下,森林作为陆地生态系统最大的碳库,其碳汇能力的精准评估已成为全球生态研究和政策制定的核心议题。而要实现这一目标,一个关键前提就是获取高精度、高效率的森林冠…
YOLOv8能否用于火星地貌分析?行星探测辅助
YOLOv8能否用于火星地貌分析?行星探测辅助 在人类对深空的探索不断深入的今天,火星早已不再是遥远而神秘的红色星球——它正逐渐变成一张张高分辨率遥感图像、一组组地质数据和一条条科学假设的集合体。NASA、ESA乃至中国的天问任务每天都在向地球传回TB…