C语言实现C++的封装继承与多态
来源:互联网 发布:互联网大数据查询 编辑:程序博客网 时间:2024/04/20 09:44
1、 概述
C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:
#ifndef Interface#define Interface struct#endif
C++在语言级别上添加了很多新机制(继承,多态等),而在C语言中,我们也可以使用这样的机制,前提是我们不得不自己实现。
本文介绍了用C语言实现封装,继承和多态的方法。
2、 基本知识
在正式介绍C语言实现封装,继承和多态事前,先介绍一下C语言中的几个概念和语法。
(1) 结构体
在C语言中,常把一个对象用结构体进行封装,这样便于对对象进行操作,比如:
strcut Point{int x;int y;};
结构体可以嵌套。因而可以把一个结构体当成另一个结构体的成员,如:
struct Circle {struct Point point_;int radius;};
该结构体与以下定义完全一样(包括内存布置都一样):
struct Circle {int x;int y;int radius;};
(2) 函数指针
函数指针是指针的一种,它指向函数的首地址(函数的函数名即为函数的首地址),可以通过函数指针来调用函数。
如函数:
int func(int a[], int n);
可以这样声明函数指针:
int (*pFunc)(int a[], int n);
这样使用:
pFunc = func;(*pFunc)(a, n);【或者PFunc(a, n)】
可以用typedef定义一个函数指针类型,如:
typdef int (*FUNC)(int a[], int n)
可以这样使用:
int cal_a(FUNC fptr, int a[], int n){//实现体}
(3) extern与static
extern和static是C语言中的两个修饰符,extern可用于修饰函数或者变量,表示该变量或者函数在其他文件中进行了定义;static也可用于修饰函数或者变量,表示该函数或者变量只能在该文件中使用。可利用它们对数据或者函数进行隐藏或者限制访问权限。
3、 封装
在C语言中,可以用结构+函数指针来模拟类的实现,而用这种结构定义的变量就是对象。
封装的主要含义是隐藏内部的行为和信息,使用者只用看到对外提供的接口和公开的信息。有两种方法实现封装:
(1) 利用C语言语法。在头文件中声明,在C文件中真正定义它。
这样可以隐藏内部信息,因为外部不知道对象所占内存的大小,所以不能静态的创建该类的对象,只能调用类提供的创建函数才能创建。这种方法的缺陷是不支持继承,因为子类中得不到任何关于父类的信息。如:
//头文件:point.h#ifndef POINT_H#define POINT_Hstruct Point;typedef struct Point point;point * new_point(); //newer a point objectvoid free_point(point *point_);// free the allocated space#endif//C文件:point.c#include”point.h”strcut Point{int x;int y;};point * new_point(){point * new_point_ = (point *) malloc(sizeof(point));return new_point_;}void free_point(point *point_){if(point_ == NULL)return;free(point_);}
我们在使用point.h中的函数时,我们只能看见接口函数,并不能看见其定义和实现。
(2) 把私有数据信息放在一个不透明的priv变量或者结构体中。只有类的实现代码才知道priv或者结构体的真正定义。如:
#ifndef POINT _H#define POINT_Htypedef struct Point point;typedef struct pointPrivate pointPrivate;strcut Point{Struct pointPrivate *pp;};int get_x(point *point_);int get_y(point *point_);point * new_point(); //newer a point objectvoid free_point(point *point_);// free the allocated space#endif//C文件:point.c#include”point.h”struct pointPrivate{int x;int y;}int get_x(point *point_){return point_->pp->x;}int get_y(point *point_){return point_->pp->y;}//others…..
二、继承与多态的概念
继承:是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性 和行为,并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。
多态:按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同现方式即为多态。同一操作作 用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单说就是允许基类的 指针指向子类的对象。
实现:
//C++中的继承与多态struct A{ virtual void fun() //C++中的多态:通过虚函数实现 { cout << "A:fun()" << endl; } int a;};struct B :public A //C++中的继承:B类公有继承A类{ virtual void fun() //C++中的多态:通过虚函数实现(子类的关键字virtual可加可不加) { cout << "B:fun()" << endl; } int b;};//C语言模拟C++的继承与多态typedef void(*FUN)(); //定义一个函数指针来实现对成员函数的继承struct _A //父类{ FUN _fun; //由于C语言中结构体不能包含函数,故只能用函数指针在外面实现 int _a;};struct _B //子类{ _A _a_; //在子类中定义一个基类的对象即可实现对父类的继承 int _b;};void _fA() //父类的同名函数{ printf("_A:_fun()\n");}void _fB() //子类的同名函数{ printf("_B:_fun()\n");}void Test1(){ //测试C++中的继承与多态 A a; //定义一个父类对象a B b; //定义一个子类对象b A* p1 = &a; //定义一个父类指针指向父类的对象 p1->fun(); //调用父类的同名函数 p1 = &b; //让父类指针指向子类的对象 p1->fun(); //调用子类的同名函数 //C语言模拟继承与多态的测试 _A _a; //定义一个父类对象_a _B _b; //定义一个子类对象_b _a._fun = _fA; //父类的对象调用父类的同名函数 _b._a_._fun = _fB; //子类的对象调用子类的同名函数 _A* p2 = &_a; //定义一个父类指针指向父类的对象 p2->_fun(); //调用父类的同名函数 p2 = (_A*)&_b; //让父类指针指向子类的对象,由于类型不匹配所以要进行强转 p2->_fun(); //调用子类的同名函数}
原文:http://dongxicheng.org/cpp/ooc/和http://www.php8.org/C/113695.html
- C语言实现C++的封装继承与多态
- C语言实现C++的封装继承和多态
- C语言是怎样实现封装、继承、多态的?
- C语言下的封装、继承与多态
- C语言实现封装,继承
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- c语言实现封装,继承和多态
- c语言实现封装,继承和多态
- c语言实现封装,继承和多态
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- c语言实现封装,继承和多态
- C语言实现封装、继承和多态
- C语言实现封装、继承和多态
- 刷题记录luoguP1972 [SDOI2009]HH的项链
- 最大公约数算法
- 宏定义中的反斜杠"\"和宏定义的细节说明
- STM32控制步进电机实现精确转动
- 静态代码块,构造代码块,构造方法的加载执行顺序研究
- C语言实现C++的封装继承与多态
- 手机ios安卓扫描车牌识别SDK
- 2017年6月,两个手游换皮项目,第六,七
- 第8,9个项目,手游开发,棋牌
- es6 语法结构和列子
- 20170729补充一下Python和Tensorflow的安装过程
- Qt学习-入门1
- 微信公众号文章采集系统---开箱即用
- Linux 输入输出(I/O)重定向