多态的C语言实现版本
#ifndef _51_2_H
#define _51_2_H
typedef void Demo;
typedef void Derived;
Demo* Demo_create(int i,int j);
int Demo_geti(Demo*pthis);
int Demo_getj(Demo*pthis);
int Demo_add(Demo*pthis,int value);
void Demo_free(Demo*pthis); Derived*Derived_create(int i,int j,int k);
int Derived_getk(Derived*pthis);
int Derived_add(Derived*pthis,int value);
#endif
#include<stdio.h>
#include"51-2.h"
#include<malloc.h>
//定义父子类的虚函数
static int Demo_virtual_add(Demo*pthis,int value);
static int Derived_virtual_add(Derived*pthis,int value);
//2。确定虚函数表的类型,虚函数表的结构体,用来创建虚函数表,存储虚函数地址
//目的是为了实现add函数的多态
struct vtbl{
int(*padd)(Derived*,int);//3。函数指针的定义
};
struct classdemo{
struct vtbl* vptr;//1。定义虚函数表指针,指针的类型
int mi;
int mj;
};
static struct vtbl g_Demo_vtbl = {
Demo_virtual_add
};//4。全局虚函数表变量,static关键字将该变量隐藏在此文件中,外部不能访问
static struct vtbl g_Derived_vtbl = {
Derived_virtual_add
};
struct classderived{
struct classdemo d;
int mk;
};
Demo* Demo_create(int i,int j){
struct classdemo* ret = (struct classdemo*)malloc(sizeof(struct classdem o));//分配空间
if(ret != NULL){
ret->vptr = &g_Demo_vtbl;//5。将虚函数表和具体对象关联起来
ret->mi = i;
ret->mj = j;
}
return ret;
}
int Demo_geti(Demo*pthis){//具体实现函数 强制类型转换
struct classdemo* obj = (struct classdemo*)pthis;
return obj->mi;
}
int Demo_getj(Demo*pthis){
struct classdemo* obj = (struct classdemo*)pthis;
return obj->mj;
}
//6。分析、实现具体的虚函数
static int Demo_virtual_add(Demo*pthis,int value){
struct classdemo* obj = (struct classdemo*)pthis;
return obj->vptr->padd(pthis,value);
}
int Demo_add(Demo*pthis,int value){
struct classdemo* obj = (struct classdemo*)pthis;
return obj->mi + obj->mj + value;
}
void Demo_free(Demo*pthis){
free(pthis);
}
Derived*Derived_create(int i,int j,int k){
struct classderived* ret = (struct classderived*)malloc(sizeof(struct cl assderived));
if(ret != NULL){
ret->d.vptr = &g_Derived_vtbl;//关联到子类的虚函数表上去
ret->d.mi = i;
ret->d.mj = j;
ret->d.mi = i;
ret->d.mj = j;
ret->mk = k;
}
return ret;
}
int derived_getk(Derived* pthis){
struct classderived* obj = (struct classderived*)pthis;
return obj->mk;
}
static int Derived_virtual_add(Derived*pthis,int value){
struct classderived* obj = (struct classderived*)pthis;
return obj->mk + value;
}
int Derived_add(Derived*pthis,int value){
struct classderived* obj = (struct classderived*)pthis;
return obj->d.vptr-> padd(pthis,value);
}
#include<stdio.h>
#include"51-2.h"
void run(Demo*p,int v){
int r = Demo_add(p,v);
printf("r=%d\n",r);
}
int main(){
Demo* pb = Demo_create(,);
Demo* pd = Derived_create(,,); printf("Demo_add(3)=%d\n",Demo_add(pb,));
printf("Derived_add(3)=%d\n",Derived_add(pd,)); run(pb,);
run(pd,);
Demo_free(pb);
Demo_free(pd);
return ;
}
多态的C语言实现版本的更多相关文章
- go语言最新版本 下载地址
国内官方网站无法打开.放在了百度云中,定期会更新: 链接:http://pan.baidu.com/s/1dD59duh 密码:46ek 备用地址:http://pan.baidu.com/s/1hq ...
- 如何在Visual studio中修改所使用C#语言的版本
有时候,我们需要在Visual studio里修改当前使用的C#语言的版本,具体修改方法如下:在solution explorer中右键工程->选择属性->切换到Build页->点击 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...
- 微软的R语言发行版本MRO及开发工具RTVS
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...
- C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- MFC多语言程序版本,在不同的windows系统上的使用
如何使MFC程序界面支持多国语言?这次使用后给自己做一个总结. 我们使用vc6.0的版本来试验 1. 切换到资源视图,右键Dialog->Insert Copy 2. ok后,会出来一个语言的选 ...
- Python笔记(三)继承和多态、动态语言
一.继承 先定义一个A类 class A(object): def fun(self): print "Run A fun()" 在定义一个B类 class B(A): pass ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
历史版本C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA ...
随机推荐
- java web基础
WEB基础 C/S:即服务器-客服机(Client-Server)结构.C/S结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务.客户通过局域网与服务器相连,接受用户的请求,并 ...
- vue项目中使用bpmn-流程图json属性转xml(七篇更新完成)
内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...
- ABAP基础3:OPENSQL
select result from source where condition group by fileds having condition order by fields into targ ...
- Pyqt5_QComboBox
QComboBox 是一个集按钮和下拉选项于一体的控件,也称做下拉列表框 方法 addItem() 添加一个下拉选项 addItems() 从列表中添加下拉选项 Clear() 删除下拉选项集合中的所 ...
- 第3章_关系数据库标准语言(SQL)_006_由元组关系演算到SQL Command_001_蕴含式 (其中有对EXISTS的分析)
前序的链接:元组关系演算 六. 蕴含式 ===>1. 什么是“蕴含式”===>设p.q为两个命题.复合命题“如果p,则q”称为p与q的蕴含式,记作p→q,并称p为蕴含式的前件,q为后件.定 ...
- Mac下搭建atx2环境
Git-atx2官网地址,默认已有python3环境 1.安装rethinkdb 安装db:mac上安装很简单,执行brew install rethinkdb 启动db:nohup rethinkd ...
- jmeter之cookies管理器的使用
作用: 1 发送请求,经常要校验cookies信息 2 针对有的cookie是用的sessionid来进行校验的,这个就需要自己去配置cookie管理器里面的信息,而且sessionid是有时效性的 ...
- nodejs 开发服务端 部署到 iis 服务器环境 -- iisnode 安装问题解决记录
开发环境 nodejs: v10.15.3 windows: 10 iis: 10 需求: 用Nodejs开发了服务端,要部署到IIS 需要在IIS服务器上安装iisnode,结果遇到问题:安装不上 ...
- python3.7 64bit安装pygame1.9.3
https://blog.csdn.net/xiaolixi199311/article/details/79209506/
- [JavaWeb基础] 026.JAVA中使用Axis搭建webservice-环境搭建(一)
在实际的项目开发过程中,我们经常会使用第三方交互,特别是在前后端语言不一致的情况下,相信webservice这个第三方控件大家都清楚.后面会慢慢带大家来学习它的使用方式,下面就先讲讲它的工具搭建. 一 ...