C语言模拟实现多态
一、多态的主要特点
1、继承体系下。继承:是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性 和行为,并能扩展新的能力,已有类被称为父类/基类,新增加的类被称作子类/派生类。
2、子类对父类的虚函数进行重写。
3、虚表。
在面向对象语言中,接口的多种不同现方式即为多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单说就是允许基类的指针指向子类的对象。
二、代码实现
1、C++中的继承与多态
class Base
{
public:
virtual void fun() {} //基类函数声明为虚函数
int B1;
};
class Derived :public Base //Derived类公有继承Base类
{
public:
virtual void fun() { //函数重写,此时基类函数可以声明为虚函数,也可以不声明
cout << "D1.fun" << endl;
}
int D1;
};
int main(){
Base b1; //创建父类对象
Derived d1;//创建子类对象 Base *p1 = (Base *)&d1;//定义一个父类指针,并通过父类指针访问子类成员
p1->fun(); Derived *p2 = dynamic_cast<Derived*> (&b1); //dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引 用( 动态转换)
p2->fun(); getchar();
return ;
}
2. C语言实现C++的继承与多态
typedef void(*FUNC)(); //定义一个函数指针来实现对成员函数的继承
struct _Base //父类
{
FUNC _fun;//由于C语言中结构体不能包含函数,故借用函数指针在外面实现
int _B1;
};
struct _Derived//子类
{
_Base _b1;//在子类中定义一个基类的对象即可实现对父类的继承
int _D1;
};
void fb_() //父类的同名函数
{
printf("_b1:_fun()\n");
}
void fd_() //子类的同名函数
{
printf("_d1:_fun()\n");
}
int main() {
_Base _b1;//定义一个父类对象_b1
_Derived _d1;定义一个子类对象_d1 _b1._fun = fb_;//父类的对象调用父类的同名函数
_d1._b1._fun = fd_;//子类的对象调用子类的同名函数 _Base *_p1 = &_b1;//定义一个父类指针指向父类的对象
_p1-> _fun(); //调用父类的同名函数 _p1 = (_Base *)&_d1;//让父类指针指向子类的对象,由于类型不匹配所以要进行强转
_p1->_fun(); //调用子类的同名函数 getchar();
return ;
}
C语言模拟实现多态的更多相关文章
- 关于c语言模拟c++的多态
关于c++多态,个人认为就是父类调用子类的方法,c++多态的实现主要通过虚函数实现,如果类中含有虚函数,就会出现虚函数表,具体c++多态可以参考<深度探索c++对象模型> c语言模拟多态主 ...
- c语言模拟c++的继承和多态
//C++中的继承与多态 struct A { virtual void fun() //C++中的多态:通过虚函数实现 { cout << "A:fun()" < ...
- 语言模拟ATM自动取款机系统
C语言实验报告 题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...
- C++基础 (8) 第八天 数组指针 模板指针 C语言中的多态 模板函数
1昨日回顾 2 多态的练习-圆的图形 3多态的练习-程序员薪资 4员工管理案例-抽象类和技术员工的实现 employee.h: employee.cpp: technician.h: technici ...
- C语言::模拟实现strlen函数
题目要求 编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0 ...
- C语言:模拟密码输入显示星号
一个安全的程序在用户输入密码时不应该显示密码本身,而应该回显星号或者点号,例如······或******,这在网页.PC软件.ATM机.POS机上经常看到.但是C语言没有提供类似的功能,控制台上只能原 ...
- c语言模拟实现oc引用计数
#include<stdio.h> #include<stdlib.h> //在c中引入 引用计数机制 // 要解决的问题: 1,指向某块动态内存的指针有几个? // ...
- Go语言模拟实现简单的区块链
一.创建项目 按照Go语言最佳实践的思路, 在工作空间下的src目录下创建 github.com/hangzhou-huxin/blokcchain目录作为我们的项目目录,然后用GoLand工具选中这 ...
- go 语言模拟百度登录
1.参考网上Python的例子自己写了一个go语言的.这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅! 2.本文参考http: ...
随机推荐
- Struts2.5简单使用入门
今天学了Struts2.5最新版的,老师在黑板上讲的很是简单,也很是容易,简单的就实现了.可是课下让我们自己弄,自己无论如何都无法运行成功,一直提示404.偶然间灵机一动,改了一下那个文件就好了.希望 ...
- React+Node初尝试
这是第一次写React和Node,选用的是前端Material-ui框架,后端使用的是Express框架,数据库采用的是Mongodb. 项目代码在:GitHub/lilu_movie 这是一个通过从 ...
- vue-router2.0简单路由嵌套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Oracle常见错误集锦
1.ORA-12560:TNS:协议适配器错误 OracleService<SID>服务没有启动 2. ORA-12541:TNS:无监听程序 Oracle<ORACLE_HOME& ...
- JavaScript设计模式读书笔记之一:接口
接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...
- 635B. Bear and Compressing
B. Bear and Compressing time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- ATM取款小项目
项目要求: 1.用户需要从控制台输入账号密码,账号或者密码不正确报异常 2.每日取款的金额有限制(100,30000),否则报异常 3.每次取款都要有记录,并在下一次取款时显示出来 思路: 1.先在& ...
- PID控制算法研究
1.matlab模糊控制工具箱:http://blog.csdn.net/gameboy12615/article/details/6367459 2.书籍:先进PID控制MATLAB仿真/刘金琨著 ...
- DataTable源码分析(二)
DataTable源码分析(二) ===================== DataTable函数分析 ---------------- DataTable作为整个插件的入口,完成了整个表格的数据初 ...
- iOS标注和适配
很多项目一开始没有注意美术素材的规范,这在后期会引起混乱.假如有机会做一个新项目(旧项目会有自己的历史问题,一下子很难改过来),建议设计师和程序员一起坐下来.共同设立一套规范,之后共同遵守. 下面说说 ...