环境: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,不允许同名函数重复定义.
相关推荐
在书中,作者可能详细讲解了如何利用这些特性来构建类的表示,并实现继承、多态和封装等OOP核心概念。 1. **继承**:在C中,可以通过结构体嵌套和指针的方式实现类的层次结构,模拟继承。子类可以包含一个指向父类...
在C语言中实现类的继承,可以先将父类的函数成员复制到子类中,然后在子类中实现这些函数。例如,将鼠标放在类cb上,按下Ctrl+Q,父类Ft的函数f1, f2, f3, f4, f5会被复制到cb类中,并可以在cb类中完成它们的个性化...
在C语言中实现OOP,通常包括封装、继承和多态这三大特性。 1. 封装:封装是将数据和操作这些数据的方法绑定在一起,形成一个独立的单元,即对象。在C语言中,可以借助结构体来封装数据,通过函数指针或者宏定义实现...
然而,C语言本身并不支持面向对象编程(Object-Oriented Programming,简称OOP),它主要依赖于面向过程的方式进行编程。C++则在C语言的基础上引入了面向对象的概念,使得代码更加模块化,易于维护。本篇将探讨如何...
在C语言中实现面向对象编程(Object-Oriented Programming,OOP)是一种挑战,因为C语言本身并不直接支持面向对象的特性,如类、继承、封装和多态。但是,通过巧妙地使用结构体和函数指针,可以模拟出类似面向对象的...
尽管C语言本身并不支持面向对象编程(Object-Oriented Programming, OOP)的一些特性如封装、继承和多态,但通过巧妙的设计和利用C语言提供的特性(如结构体、函数指针等),还是能够在一定程度上模拟出面向对象编程...
C语言实现面向对象编程(OOP)的知识点可以分为以下几个部分: 1. 面向对象编程的基本概念 面向对象编程(OOP)是一种编程范式,它基于三个基本的设计模式或概念:封装、继承和多态。 封装(Encapsulation): ...
这通常涉及声明一个与类对应的结构体类型的变量,并利用内存分配函数为这个变量分配内存空间。创建对象之后,还需要对这个对象的属性进行初始化,这可以通过直接赋值或者编写特定的函数来完成。 文章通过实例详细...
C语言是一种基础且强大的编程语言,它不支持像面向对象编程中的“继承”和“派生”这样的概念。然而,这个描述提及的是面向对象编程(OOP)的概念,通常关联于像C++、Java或C#这样的语言。在这个场景下,我们将讨论...
在软件开发领域,面向对象编程(OOP)已经成为主流的编程范式,其中封装、继承和多态是面向对象的三大基本特征。面向对象编程在处理复杂系统时能够带来诸多便利,如易于维护、复用性高以及对现实世界抽象的直观性。...
在ACCP4.0S1课程中,Java部分会讲解基本语法、类与对象、封装、继承、多态等OOP概念。学员将学习如何设计和实现面向对象的程序,理解类与对象的关系,以及如何利用接口和抽象类来增强代码的灵活性和可扩展性。 3. *...
#### C语言与面向对象编程 C语言作为一种过程式的编程语言,其核心特性包括函数、变量、结构体和指针等。尽管C语言不具备内置的面向对象支持,但通过宏定义和特定的编码技巧,依然可以在C语言中实现面向对象编程的...
继承(Inheritance)作为OOP的另一大特色,在C语言中也有相应的模拟方式。虽然C语言本身不支持继承,但通过结构体的嵌入以及函数指针的引用,我们仍然可以在C语言中实现类似继承的机制。学习者将学习如何设计基类和...
"OOP-in-C"这个主题就是探讨如何在C语言中实现面向对象编程。 **1. 封装:** 在C语言中,我们可以通过结构体来封装数据,再通过函数指针或者全局函数来处理结构体内的数据。这样可以隐藏数据的内部细节,实现数据的...
在C++和C这两个标签中,C++是C语言的一个扩展,增加了面向对象编程(OOP)的概念,如类、对象、继承、多态等。虽然标题并未直接提及C++,但由于两者有密切关联,读者在学习C语言的过程中,可能会接触到C++的相关知识...
在C语言中,"继承"的概念通常不被直接支持,因为C是一种静态类型、过程导向的语言,而继承是面向对象编程(OOP)中的概念。然而,通过巧妙地使用指针和结构体,我们可以模拟出类和继承的效果。这篇课程设计的源码...
虽然C语言本身并不原生支持OOP特性,如类、继承和多态,但通过巧妙的结构体和函数指针等机制,可以实现类似的抽象和封装。这篇文档详细阐述了如何在C语言中构建面向对象的程序设计模式,以帮助开发者更深入地理解OOP...
C++是一种强大的编程语言,它继承了C语言的效率,并引入了面向对象编程(OOP)的概念。在C++中,对象和类是OOP的核心元素。本课件旨在帮助学习者深入理解C++,特别是关于C语言、对象与类的知识。 首先,对象是现实...
C语言基础类的设计主要涉及到面向对象编程的基本概念和原则。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它基于“对象”的概念,这些对象是由数据(属性)和操作这些数据的方法(行为)组成...