环境:Linux Mint 17.1 32bit
GCC:(Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
第一步程序主入口main.c,代码如下
#include <stdio.h> int main(){ printf("Hello World\r\n"); return 1; }
编译执行
gcc main.c -o main ./main
输出:HelloWorld
第二步编写结构体PersonClass文件person.h,代码如下
typedef struct person{ int age; char* name } PersonClass;
第三步编写测试代码
#include <stdio.h> #include "person.h" int main(){ PersonClass p; p.name="Jack"; p.age=21; printf("HelloWorld\r\n"); printf("I am %s,i am %d",p.name,p.age); }
编译执行输出.
第四步编写子类Student完成继承
typedef struct student{ PersonClass p; void (*sayHello)(void); void (*setName)(char*,PersonClass*); void (*setAge)(int,PersonClass*); }StudentClass; void sayHello(){ printf("Good everybody\r\n"); } void setName(char* name,PersonClass* p){ p->name=name; } void setAge(int age,PersonClass* p){ p->age=age; }
上面代码中定义了三个函数指针,因为标准C结构体里面是不可以定义函数的,只能定义变量.
所以定义了两个所谓的Java中的setter函数,以及一个毫不相关的sayHello函数.
那么接着看如何使用.
#include <stdio.h> #include "person.h" #include "student.h" int main(){ PersonClass p; p.name="Jack"; p.age=21; printf("HelloWorld\r\n"); printf("I am %s,i am %d\r\n",p.name,p.age); StudentClass stu; stu.sayHello=&sayHello; stu.sayHello(); stu.setName=&setName;//初始化Setter stu.setName("ZhangHuiHui",&(stu.p)); stu.setAge=&setAge;//初始化Setter stu.setAge(0x28,&(stu.p)); printf("i am %s,i am %d\r\n",stu.p.name,stu.p.age); }
我们发现,在使用结构体Student时,如果采用面向对象的思想封装字段,是很痛苦的.至于继承,完全就是用一个Person成员变量来替代.但是因为C的不面向对象因素,我们在进行设置属性时,需要传递指针进去.
stu.p.name="ZhangHuiHui";//不面向对象去设置name
stu.setName("ZhangHuiHui",&(stu.p));//面向对象设置name(所谓的字段封装)
可以看出如果用C去实现封装字段,不是不可以,而是很繁琐.
假设有A,B ,C,D,四个结构体,并且继承关系如:D<C<B<A;
那么我们去封装字段去设置属性时,启不是要D.B.C.A.xxx=?;Or D.setXX(&(D.C.B.A));
C的特性决定了函数永远不可能归属于任何一个(跟面向对象最接近的)Struct;
C语言里指针才是霸主.但终究,面向对象是编程思想,而并非专属Java.
问题:我们直接在头文件里定义了setName setAge函数.如果我们在main.c中再定义一次呢?
不幸的是,我们不能再定义了,哪怕名字相同,形参不同也不允许.因为C不支持函数重载.
所以最大的问题是,C 没有包管理机制,函数名字就是唯一ID,不允许同名函数重复定义.
相关推荐
此文档介绍把c语言像c++一样编程,让c语言有类,继承,多态的特性,且不会增加工作量,合适骨灰级C程序员参考。
当然不,幸好已经有很多优秀的设计师为我们指明了C语言OOP化的道路。 虽然OOPC语法不如C++那么简洁,但是OOPC也有亮丽的特色,就是编译后的程序所占的内存空间比C++小的多,执行效率高,适用于Embedded System。
这份文档描述了如何用C语言来实现OOP的三大基本概念:封装、继承、多态。其中前两个实现起来非常简单,不用花费任何的代价就可以实现。
Quatum Leap框架作者介绍C语言面向对象的资料,介绍了如何用C实现继承,多态等面向对象的行为。
C语言教程(原书第4版) 《c语言教程(原书第4版)》是一...14.10 java和oop的优势 14.11 总结 14.12 练习 附录a 标准函数库 附录b c的语法 附录c ansi c与传统c的比较 附录d ascii字符码 附录e 操作符的优先级和结合性
OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码。开始进入正题。 二、类继承示例 场景如下:现需要记录乒乓球运动成员的信息,包括...
1.C语言与C++语言的区别与联系; 2.C++内存模型,命名空间和数据类型; 3.C++函数,引用,内联函数,函数模板,函数重载; 4.面向对象编程(OOP),类和对象; 5.构造器,拷贝构造,析构,new/delete; 6.运算符重载;面向...
C++是一种高级编程语言,它是在C语言基础上发展出来的,继承了C语言的基本语法和功能,同时增加了许多新的特性,最重要的是面向对象编程(OOP)特性,这一特性让C++成为一种非常强大和灵活的编程语言。 面向对象编程...
它表现出来的三个最基本的特性就是封装、继承与多态。很多面向对象的编程语言已经包含这三个特性了,例如 Smalltalk、C++、Java。但是你也可以用几乎所有的编程语言来实现面向对象编程,例如ANSI-C。要记住,面向...
•封装–可以将数据和功能打包到类中•继承–可以基于现有类定义新类以获得重用和代码组织的能力•多态性–在运行时互相替换匹配接口的对象的能力尽管这些设计模式传统上已与诸如Smalltalk,C ++或Java之类的面向...
封装、继承与多态 构造函数与析构函数 访问修饰符:public, private, protected 进阶特性 指针与引用 动态内存分配 STL库介绍:vector, map, set等 异常处理 C++的实际应用 C++在游戏开发中的应用 C++在系统编程中...
7.1.4与C语言的区别 7.2指针 7.2.1指向const的指针 7.2.2const指针 7.2.3赋值和类型检查 7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间...
内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚函数、模板和包容器...
7.1.4 与C语言的区别 126 7.2 指针 127 7.2.1 指向const的指针 127 7.2.2 const指针 127 7.2.3 赋值和类型检查 128 7.3 函数参数和返回值 128 7.3.1 传递const值 128 7.3.2 返回const值 129 7.3.3 传递和返回地址 ...
内容关键词:变量、数据类型、运算符、控制流、类、对象、继承、多态、异常处理、集合框架、泛型、多线程、网络编程、文件IO、数据库连接(JDBC)等 用途:Java源码系统是用于学习、实践和开发Java应用程序的资源。...
同时通过继承与多态性,使程序具有很高的可重用性,使软件的开发和维护都更为方便。 由于面向对象方法的突出优点,目前它已经成为开发大型软件时所采用的主要方法,而C++语言是面向对象的程序设计语言中应用最广泛的...
全面面权威地受用DEITEL活动代码方法介绍C语言,并且大量地介绍C++面向对象程序设计(OOP)! C语言是全球最流行的程序设计语言之一。本版全球最畅销的C语言教程介绍了四种当流行的程序设计方法--面向过程、基于...
第5章介绍类与封装仅仅是OOP中的一部分,本章将介绍另一部分—继承。继承使程序员 可以使用现有的类,并根据需要进行修改。这是Java程序设计中的基础。Java中的继承机制与 C++的继承机制十分相似。C++程序员只需...