`
king_tt
  • 浏览: 2113556 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C语言面向对象编程(一):封装与继承

 
阅读更多

最近在用 C 做项目,之前用惯了 C++ ,转回头来用C 还真有点不适应。 C++ 语言中自带面向对象支持,如封装、继承、多态等面向对象的基本特征。 C 原本是面向过程的语言,自身没有内建这些特性,但我们还是可以利用 C 语言本身已有的特性来实现面向对象的一些基本特征。接下来我们就一一来细说封装、继承、多态、纯虚类等面向对象特性在 C 语言中如何实现,并且给出实例。

这篇文章中我们先说封装和继承。

先来看封装。

所谓封装,通俗地说,就是一个姑娘化了妆,只给你看她想让你看的那一面,至于里面是否刮了骨、垫了东西,不给你看。说到封装就得说隐藏,这是对兄弟概念;其实我理解隐藏是更深的封装,完全不给你看见,而封装可能是犹抱琵琶半遮面。封装在 C++ 语言中有 protected 、 private 关键字在语言层面上支持,而 C 语言中没有这些。 C 有结构体( struct ),其实可以实现封装和隐藏。

在 QT 中,为了更好的隐藏一个类的具体实现,一般是一个公开头文件、一个私有头文件,私有头文件中定义实现的内部细节,公开头文件中定义开放给客户程序员的接口和公共数据。看看 QObject (qobject.h ),对应有一个 QObjectPrivate (qobject_p.h ) ,其他的也类似。而代码框架如下:

QObject{
public:
    xxx
    xxx
private:
    QObjectPrivate * priv;
};
我们在 C 语言中完全可以用同样的方法来实现封装和隐藏,只不过是放在结构体中而已。代码框架如下:

struct st_abc_private;
struct st_abc {
    int a;
    xxx;
    void (*xyz_func)(struct st_abc*);

    struct st_abc_private * priv;
};
上面的代码,我们只前向声明结构体 struct st_abc_private ,没人知道它里面具体是什么东西。假如 struct st_abc 对应的头文件是 abc.h ,那么把 st_abc_private 的声明放在 abc_p.h 中,abc.c 文件包含 abc_p.h ,那么在实现 struct st_abc 的函数指针 xyz_func 时如何使用 struct st_abc_private ,客户程序员根本无须知道。

这样做的好处是显而易见的,除了预定义好的接口,客户程序员完全不需要知道实现细节,即便实现经过重构完全重来,客户程序员也不需要关注,甚至相应的模块连重新编译都不要——因为 abc.h 自始至终都没变过。

上面代码有个问题,客户程序员如何得到 struct st_abc 的一个实例,他不知道 struct st_abc_private 如何实现的呀。 C 中没有构造函数,只好我们自己提供了:我们可以在 abc.h 中声明一个类似构造函数的函数来生成 struct st_abc 的实例,名字就叫作 new_abc() ,函数原型如下:

struct st_abc * new_abc();
至于实现,我们放在 abc.c 中,客户程序员不需要知道。相应的,还有个类似析构函数的函数,原型如下:

void delete_abc(struct st_abc *);

到现在为止,封装和隐藏就实现了,而且很彻底。接下来看继承。

什么是继承?在面向对象层面上不讲了,只说语法层面。语法层面上讲,继承就是派生类拥有父类的数据、方法,又添了点自己的东西,所谓子承父业,发扬光大。在 C 语言中可以用结构体的包含来实现继承关系。代码框架如下:

struct st_base{
    xxx;
};

struct st_derived{
    struct sb_base base;
    yyy;
};
代码上就是这么简单,不过有一点要注意:第一点就是派生类(结构体)中一定要把父类类型的成员放在第一个。

继承在语法层面上看,有数据成员、函数,数据成员通过上面的方法自动就“继承”了,至于函数,在结构体表示为函数指针,其实也是一个数据成员,是个指针而已,也会自动“继承”。之所以还要在这里列出来说明,是因为 C++ 中有一个很重要的概念:重载。要在 C 中完整实现有点儿麻烦。

重载,我们常说的重载大概有三种含义:

  • 其一,函数重载,指函数名字一样,参数个数、类型不一样的函数声明和实现。由于 C 编译器的缘故,不支持。不过这个影响不大。
  • 其二,重定义或者说覆盖,指派生类中定义与基类签名一样(名字、返回值、参数完全一样)的非虚函数,这样派生类的中的函数会覆盖基类的同签名函数,通过成员操作符访问时无法访问基类的同签名函数。
  • 其三,虚函数重写,指在派生类中实现基类定义的虚函数或纯虚函数。虚函数是实现多态的关键,可以在结构体中使用函数指针来表达,但要完全实现,也很麻烦。

我们平常在交流时通常不明确区分上面三种类型的重载,这里出于习惯,也不作区分。
好了,第一篇就到这里,有时间会往下续。

分享到:
评论

相关推荐

    用C-语言实现面向对象编程.pdf

    用 C 语言实现面向对象编程,我曾经在嵌入式控制系统工作过,苦于嵌入式系统编程一直是 C 语言,而没法用 C++或其他高级 语言的面向对象方法编程。经过研究生的学习和探索,偶然间发现高焕堂老师写 OOPC(面向对象 C...

    C语言实现面向对象编程

    面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法、设计思想。它表现出来的三个最基本的特性就是封装、继承与多态。很多面向对象的编程语言已经包含这三个特性了,例如Smalltalk、C++、Java。...

    C语言与面向对象编程.pdf

    众所周知,C 语言是面向过程的编程语言,把它和“面向对象”连接起来似乎不太可能。其实“面向对象”是一种思想,编程...文章通过 C 语言中的结构体实现了“面向对象”的继承、封装和多态,阐述了具体的实现过程,进一...

    OOP in C(C语言实现面向对象编程)

    这份文档描述了如何用C语言来实现OOP的三大基本概念:封装、继承、多态。其中前两个实现起来非常简单,不用花费任何的代价就可以实现。

    第一章JAVA面向对象的程序设计.doc

    2:与其说是学会一种新的编程语言,还不如说学会一种新的分析问题的方法:面向对象的思考方法。 3:面向过程的的语言的特点分析:至上而下,层层细化的求解过程。 其表现形式:以函数作为基本运行单位,以函数参数...

    Object-C语言教程&

    Objective-C 是一种简单的计算机语言,设计为可以支持真正的面向对象编程。 Objective-C 通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的 ANSI C 语言。类的语法和...

    c++编写电话簿小程序 word版

    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛;C++支持多种编程范式 -面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。[1] 其编程领域众广,常用于系统开发,引擎开发等...

    C语言课程设计大作业—在Windows平台下开发的Fat32文件系统.zip

    项目使用C语言实现, 但是借鉴了面向对象编程思想, 将一些方法和属性进行了封装, 并且实现了面向对象编程中"继承"和"多态"的特性C语言课程设计大作业—在Windows平台下开发的Fat32文件系统。项目被拆解成了多个层次,...

    纯c语言实现面向对象分析与示例分享

    采用C语言实现的关键是如何运用C语言本身的特性来实现多态、继承面、封装的面向对象的特征,最近给出了例子,大家可以参考使用

    C语言和C++语言的区别是什么?快速入门C++编程的方法解析.docx

    面向对象编程是一种编程范式,它将数据和函数绑定在一起,形成“类”,并通过“对象”来操作数据和函数。C++中的类可以封装数据和行为,并对数据进行操作,这使得代码更加模块化,易于维护和扩展。C++还支持运算符...

    嵌入式C语言面试题汇总(超经典).pdf

    对于嵌入式Linux开发类职位来说,最重要的是C语言基本功底,对C语言要了解的十分透彻,比如C语言的面向对象编程,怎么用C语言去实现面向对象类高级语言的继承、多态、封装。达到熟练掌握数据结构,尤其是链表。对于...

    传智播客C++课件

    1.C语言与C++语言的区别与...7.面向对象编程(OOP)继承; 8.面向对象编程(OOP)友元; 9.面向对象编程(OOP)多态; 10.类模板; 11.类的转换,类与指针,输入输出流; 12.C++调试技巧,错误排查技巧;C++11标准与Boost库,STL库;

    学会C语言之后还有必要学习C++吗?具体运用C++编写的代码解析.docx

    C++是一种高级编程语言,它是在C语言基础上发展出来的,继承了C语言的基本语法和功能,同时增加了许多新的特性,最重要的是面向对象编程(OOP)特性,这一特性让C++成为一种非常强大和灵活的编程语言。 面向对象编程...

    Object-C语言教程.docx

    Object-C,通常写作ObjC或OC,是扩充C的面向对象编程语言。它的主要特点包括面向对象、动态性、扩展性、自动垃圾回收机制、C语言兼容性以及静态类型检查等。Objective-C主要用于Mac OS X和GNUstep这两个使用OpenStep...

    第一章C++视频介绍视频

    在这个视频中,我们将带您走进C++的世界,从基础语法开始,逐步深入到面向对象编程的核心概念。无论您是初学者,还是有一定编程经验的开发者,这个视频都将为您提供宝贵的参考和指导。 视频大纲: C++简介 C++的...

    B级-Quiz 3_C语言_C语言quiz_

    按照其程序设计的出发点和方式不同,高级语言分为了面向过程的语言和面向对象的语言,如Fortran语言、C语言、汉语程序设计语言等都是面向过程的语言;而以C++、Smalltalk等为代表的面向对象的语言与面向过程语言有着...

    C++在编程语言界的地位如何?学好C++可以做些什么?.docx

    除了掌握基本的编程概念,你还需要了解面向对象编程的概念,如封装、继承和多态,这些是理解C++的重要性。在学习过程中,可以通过编写各种小程序来巩固自己的知识。同时,也可以参加一些线下或线上的课程、培训或...

    Dev-C++编译程序器

    C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。 C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计...

    c++语言程序设计教程答案

    面向对象方法具有封装性、继承性和多态性。 √3.C语言是C++语言的一个子集。C++语言继承了C语言。 ×4.C++语言程序与C语言程序一样都是函数串。 ×5.C++语言支持封装性和继承性,不支持多态性。 √6.C++语言比...

Global site tag (gtag.js) - Google Analytics