C语言 - 继承

📅 2026/7/27 9:56:18
C语言 - 继承
我们知道C 的三大特性就是封装、继承、多态同时这也是面向对象的重要特性在这些特性的基础上我们在结合一些设计模式这样我们的项目就变得高内聚低耦合同时也增强了代码的安全性可读性可维护性。我们在学习Linux内核代码的时候就会发现其实里面已经广泛利用C语言实现了这些特性下面我们一起来学习一下怎么用C语言来实现这些面向对象的特性。这一章我们先来聊聊继承我们通过LED来举例我们分别有3个LEDGPIO灯、PWM灯、I2C灯三个Struct抽出来我们发现会有很多是相似的如图我们发现其中name、state是一模一样的如果我们加入第四种改一次name的逻辑三个都要改但凡是改漏一个就出现了bug怎么办这时候我们把相同的部分抽出来生成一个LedBase然后放进其他3个struct如下图Struct里面放另一个Struct就有点类似俄罗斯套娃外层包着内层有细心的小伙伴就发现了一个细节公共部分都是放在了第一个位置我们先来看看这样抽出来套娃后在内存地址中是咋样的如图所以套娃后就是内存数据在前外层数据紧跟其后连续排列经过我们上面的改造后初始化也不用重复了先初始化公众的再初始化模块的如图不只是数据函数也是能共享的例如我们要获取当前是哪个模块再使用那么写了一个const char *get_led_name(LedBase *me) {return me-name;}我们通过如下调用get_led_name(gpio_led.base);get_led_name(pwm_led.base);get_led_name(i2c_led.base);在3个LED模块中调用这个get_led_name就会返回不同的名称 这样三个LED都使用了同一个函数写一次3种led都能用只要传base的地址过去函数其实不需要知道你是哪一种led。在实践中我们会发现继承不只是数据共享行为也能共享所以继承本质并不是为了少些代码而是为了少改代码只是在我们平时的使用过程中也要注意在设计使用C的继承时我们要把基础数据放在继承结构的首位这样不管是数据强转、数据访问都不会有什么问题。