`
myten
  • 浏览: 134440 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言OOP类与继承

 
阅读更多

环境: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语言实现OOP

    在书中,作者可能详细讲解了如何利用这些特性来构建类的表示,并实现继承、多态和封装等OOP核心概念。 1. **继承**:在C中,可以通过结构体嵌套和指针的方式实现类的层次结构,模拟继承。子类可以包含一个指向父类...

    C语言OOP编程.pptx

    在C语言中实现类的继承,可以先将父类的函数成员复制到子类中,然后在子类中实现这些函数。例如,将鼠标放在类cb上,按下Ctrl+Q,父类Ft的函数f1, f2, f3, f4, f5会被复制到cb类中,并可以在cb类中完成它们的个性化...

    c语言实现面向对象OOP

    在C语言中实现OOP,通常包括封装、继承和多态这三大特性。 1. 封装:封装是将数据和操作这些数据的方法绑定在一起,形成一个独立的单元,即对象。在C语言中,可以借助结构体来封装数据,通过函数指针或者宏定义实现...

    C语言实现OOP

    然而,C语言本身并不支持面向对象编程(Object-Oriented Programming,简称OOP),它主要依赖于面向过程的方式进行编程。C++则在C语言的基础上引入了面向对象的概念,使得代码更加模块化,易于维护。本篇将探讨如何...

    C语言实现对象编程之继承代码.rar

    在C语言中实现面向对象编程(Object-Oriented Programming,OOP)是一种挑战,因为C语言本身并不直接支持面向对象的特性,如类、继承、封装和多态。但是,通过巧妙地使用结构体和函数指针,可以模拟出类似面向对象的...

    C语言实现类

    尽管C语言本身并不支持面向对象编程(Object-Oriented Programming, OOP)的一些特性如封装、继承和多态,但通过巧妙的设计和利用C语言提供的特性(如结构体、函数指针等),还是能够在一定程度上模拟出面向对象编程...

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

    C语言实现面向对象编程(OOP)的知识点可以分为以下几个部分: 1. 面向对象编程的基本概念 面向对象编程(OOP)是一种编程范式,它基于三个基本的设计模式或概念:封装、继承和多态。 封装(Encapsulation): ...

    用C语言实现类实例化的研究.pdf

    这通常涉及声明一个与类对应的结构体类型的变量,并利用内存分配函数为这个变量分配内存空间。创建对象之后,还需要对这个对象的属性进行初始化,这可以通过直接赋值或者编写特定的函数来完成。 文章通过实例详细...

    C语言程序设计继承与派生PPT学习教案.pptx

    C语言是一种基础且强大的编程语言,它不支持像面向对象编程中的“继承”和“派生”这样的概念。然而,这个描述提及的是面向对象编程(OOP)的概念,通常关联于像C++、Java或C#这样的语言。在这个场景下,我们将讨论...

    用C语言实现继承的研究.pdf

    在软件开发领域,面向对象编程(OOP)已经成为主流的编程范式,其中封装、继承和多态是面向对象的三大基本特征。面向对象编程在处理复杂系统时能够带来诸多便利,如易于维护、复用性高以及对现实世界抽象的直观性。...

    北大青鸟内部教学课件ACCP4.0S1(C语言,Java&OOP,SQL,STB)

    在ACCP4.0S1课程中,Java部分会讲解基本语法、类与对象、封装、继承、多态等OOP概念。学员将学习如何设计和实现面向对象的程序,理解类与对象的关系,以及如何利用接口和抽象类来增强代码的灵活性和可扩展性。 3. *...

    C语言中的面向对象编程技术.pp(中文翻译版)

    #### C语言与面向对象编程 C语言作为一种过程式的编程语言,其核心特性包括函数、变量、结构体和指针等。尽管C语言不具备内置的面向对象支持,但通过宏定义和特定的编码技巧,依然可以在C语言中实现面向对象编程的...

    133个c程式范例的光碟 (oop)

    继承(Inheritance)作为OOP的另一大特色,在C语言中也有相应的模拟方式。虽然C语言本身不支持继承,但通过结构体的嵌入以及函数指针的引用,我们仍然可以在C语言中实现类似继承的机制。学习者将学习如何设计基类和...

    OOP-in-C C语言面向对象

    "OOP-in-C"这个主题就是探讨如何在C语言中实现面向对象编程。 **1. 封装:** 在C语言中,我们可以通过结构体来封装数据,再通过函数指针或者全局函数来处理结构体内的数据。这样可以隐藏数据的内部细节,实现数据的...

    C语言分析案例与详解

    在C++和C这两个标签中,C++是C语言的一个扩展,增加了面向对象编程(OOP)的概念,如类、对象、继承、多态等。虽然标题并未直接提及C++,但由于两者有密切关联,读者在学习C语言的过程中,可能会接触到C++的相关知识...

    公司人员,继承,自己编写 c语言版 课程设计 源码

    在C语言中,"继承"的概念通常不被直接支持,因为C是一种静态类型、过程导向的语言,而继承是面向对象编程(OOP)中的概念。然而,通过巧妙地使用指针和结构体,我们可以模拟出类和继承的效果。这篇课程设计的源码...

    绝对经典 用C实现OOP

    虽然C语言本身并不原生支持OOP特性,如类、继承和多态,但通过巧妙的结构体和函数指针等机制,可以实现类似的抽象和封装。这篇文档详细阐述了如何在C语言中构建面向对象的程序设计模式,以帮助开发者更深入地理解OOP...

    C++课件--C++、C语言、对象与类

    C++是一种强大的编程语言,它继承了C语言的效率,并引入了面向对象编程(OOP)的概念。在C++中,对象和类是OOP的核心元素。本课件旨在帮助学习者深入理解C++,特别是关于C语言、对象与类的知识。 首先,对象是现实...

    C语言基础类的设计PPT学习教案.pptx

    C语言基础类的设计主要涉及到面向对象编程的基本概念和原则。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它基于“对象”的概念,这些对象是由数据(属性)和操作这些数据的方法(行为)组成...

Global site tag (gtag.js) - Google Analytics