【C/C++学院】0804-C语言和设计模式(继承、封装、多态)

C++有三个最重要的特点,即继承、封装、多态。我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。

(1)继承性

1.  typedef struct _parent  

2. {  

3.      int data_parent;  

4.   

5.  }Parent;  

6.   

7.  typedef struct _Child  

8. {  

9.      struct _parent parent;  

10.    int data_child;  

11.   

12.}Child;  

   在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。

(2)封装性

1.  struct _Data;  

2.   

3.  typedef  void (*process)(struct _Data* pData);  

4.   

5.  typedef struct _Data  

6. {  

7.      int value;  

8.     process pProcess;  

9.        

10.}Data;  

   封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。

(3)多态

1.  typedef struct _Play  

2. {  

3.      void* pData;  

4.     void (*start_play)(struct _Play* pPlay);  

5.  }Play;  

   多态,就是说用同一的接口代码处理不同的数据。比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。

#include<stdio.h>
#include<stdlib.h>

struct cmd
{
	char *p;
	void(*prun)(struct cmd *pcmd);
	void(*pprint)(struct cmd *pcmd);

};
typedef  struct cmd  CMD;

void run(CMD *pcmd )
{
	system(pcmd->p);
}

void print(CMD *pcmd)
{
	printf("%s", pcmd->p);
}

struct newcmd
{
	struct cmd cmd1;
	int(*plength)(struct newcmd *pnewcmd);
};

int getlength(struct newcmd *pnewcmd)
{
	return strlen(pnewcmd->cmd1.p);//返回长度
}

void main()
{
	struct newcmd newcmd1;
	newcmd1.cmd1.p = "notepad";
	newcmd1.cmd1.pprint = print;
	newcmd1.cmd1.prun = run;
	newcmd1.plength = getlength;//初始化

	newcmd1.cmd1.pprint(&newcmd1.cmd1);
	newcmd1.cmd1.prun(&newcmd1.cmd1);
	printf("%d",newcmd1.plength(&newcmd1));
	system("pause");
}

void main1()
{
	CMD cmd1 = { "notepad", run, print };
	cmd1.pprint(&cmd1);
	cmd1.prun(&cmd1);

	system("pause");
}

#include<stdio.h>
#include<stdlib.h>

struct ren
{
	void(*pj)(struct ren *p);
};

struct nanren
{
	struct ren ren1;
	void(*pj)(struct nanren *p);
};

void nanrenya(struct nanren *pnan)
{
	printf("男人的虎牙");
}

struct nvren
{
	struct ren ren1;
	void(*pj)(struct nvren *p);
};
void nvrenya(struct nvren *pnv)
{
	printf("女人的baiya ");
}
void gettooth(struct ren *pren)
{
	printf("gogogogo");
}

void main()
{
	struct nanren  tansheng1;
	tansheng1.ren1.pj = gettooth;
	tansheng1.ren1.pj(&tansheng1.ren1);

	tansheng1.pj = nanrenya;
	tansheng1.pj(&tansheng1);

	struct nvren   ftansheng1;
	ftansheng1.ren1.pj = gettooth;
	ftansheng1.ren1.pj(&ftansheng1.ren1);
	ftansheng1.pj = nvrenya;
	ftansheng1.pj(&ftansheng1);

	getchar();
}
时间: 2024-08-26 03:48:11

【C/C++学院】0804-C语言和设计模式(继承、封装、多态)的相关文章

C语言模式实现C++继承和多态

C语言模式实现C++继承和多态 描述: C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A.并且能达 到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数. C++中的继承.多态 继承是面向对象复用的重要手段.通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质 不同的东西.  继承是一种复用手段,在继承关系里基类的成员类的成员派生类的成员,由此达到复用的目的.  如果你想学习C/C

封装dll-如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用

问题描述 如何把一个能够实现完整功能的C语言写的项目封装为DLL,然后在java项目中调用 前段时间调试了一个C程序的源码,现在要在一个java web的项目中调用它来完成一个功能,求指点! 解决方案 考虑下jni,编译成so后,在java程序中引入即可 static{ System.loadLibrary("AirPos"); } 解决方案二: 但要注意路径问题,载入路径要指定正确,放置调用失败.

澄清Java语言接口与继承的本质

继承 计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉.今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包,这个这个--唉. 大多数人认为,接口的意义在于顶替多重继承.众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口.其实这样做是很牵

Java语言接口与继承的本质

  计算机学院研二的兄弟与我讨论Java,一见面,几个问题全是关于接口,接口有什么用?为什么要用接口?什么时候该使用接口?很庆幸他们不是问我Java如何连接SQL Server,或者是如何开发J2EE应用,这类问题有杀伤力,避之则吉.今年计算机学院本科有个毕业设计课题是做J2ME,选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包,这个这个--唉. 大多数人认为,接口的意义在于顶替多重继承.众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口.其实这样做是很牵强

学习JavaScript设计模式(继承)_javascript技巧

1.继承 在javascript中继承是一个非常复杂的话题,比其他任何面向对象语言的中的继承都复杂得多.在大多数其他面向对象语言中,继承一个类只需要使用一个关键字即可.与它们不同,在javascript中要想达到传承公用成员的目的,需要采取一系列措施.更有甚者,javascript属于使用原型式继承的少数语言之一.利益于这种语言的灵活性,你既可使用标准的基于类的继承,也可使用更微妙一些的原型式继承. 2.为什么需要继承? 一般来说,在设计类的时候,我们希望能减少重复性的代码,并且尽量弱化对象间的

【C/C++学院】(10)重载与重写/多态的深入/多继承接口

1. 重写 PK 重载理解  1.1 函数重载 必须在同一个类中进行 子类无法重载父类的函数,父类同名函数将被名称覆盖 重载是在编译期间根据参数类型和个数决定函数调用 1.2 函数重写 必须发生于父类与子类之间 并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类型决定函数调用 #include <cstdlib> #include <iostream> using namesp

c语言-字样的继承关系,为什么会提示:无法访问 protected 成员

问题描述 字样的继承关系,为什么会提示:无法访问 protected 成员 #include using namespace std; template class B1 { public: void SayHi() { T* pT = static_cast(this); pT->PrintClassName(); } protected: void PrintClassName() { cout << "This is B1"; } }; class D1 : p

C++语言基础 例程 继承与组合

贺老师的教学链接  本课讲解 点与直线 #include<iostream> #include<Cmath> using namespace std; class Dot { public: float x,y; Dot(float a=0,float b=0) { x=a; y=b; } void Show(void) { cout<<"x="<<x<<'\t'<<"y="<<y&

由于本人函授本科,期末JAVA两题编程不会写,楼主只会C。望高手们帮忙一下,明早一大早就要考试了,坐等

问题描述 某商场10年店庆活动,规定消费金额500元以上的部分可以给予95折,消费1000元以上的部分可以给予9折,消费2000元以上的部分可以给予85折.现要求设计一个程序,要求根据用户从键盘输入的商品总价计算出折后价.要求输出格式为:=======================原价:600.00元折后价:595.00元=======================设有一个四位数,它的四位数字分别是ABCD,而其又满足一下条件:ABCD*9=DCBA,试编写一段小程序计算这个四位数究竟是多少