C++中的两种绑定方式(静态绑定、动态绑定)
两种绑定方式
静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类。
动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类。
需要注意:
- C++默认的绑定方式是静态绑定。示例如下:
#include<iostream>
using namespace std;class bird{public:void fly(){cout<<"bird fly"<<endl;};//鸟会飞void walk(){cout<<"bird walk"<<endl;}//鸟会走
};class penguin: public bird{public:void swim();//企鹅会游泳void fly(){cout<<"penguin can not fly"<<endl;}void walk(){cout<<"penguin walk"<<endl;}
};void func1(bird&bd){bd.fly();
}
void func2(bird*pb){pb->fly();
}int main(){bird bd;penguin pg;bd.fly();//bird::fly()func1(bd);//bird::fly()func2(&bd);//bird::fly()pg.fly();//penguin::fly()func1(pg);//bird::fly()func2(&pg);//bird::fly()return 0;
}
- 必须在程序中显式地指出动态绑定。
动态绑定的实现
动态绑定的实现条件:
- 类的定义中成员函数声明为虚函数
- 通过引用或指针来访问对象的虚函数
virtual声明需要注意:
- 一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,…)中对其重定义的成员函数均为虚函数
- 重定义: 对派生类中定义的成员函数, 其函数名, 参数个数和类型以及返回值类型与基类的某个虚成员函数相同(override)
动态绑定示例:
#include<iostream>
using namespace std;class bird{public:virtual void fly(){cout<<"bird fly"<<endl;};//鸟会飞void walk(){cout<<"bird walk"<<endl;}//鸟会走
};class penguin: public bird{public:void swim();//企鹅会游泳void fly(){cout<<"penguin can not fly"<<endl;}void walk(){cout<<"penguin walk"<<endl;}
};void func1(bird&bd){bd.fly();
}
void func2(bird*pb){pb->fly();
}int main(){bird bd;penguin pg;bd.fly();//bird::fly()func1(bd);//bird::fly()func2(&bd);//bird::fly()pg.fly();//penguin::fly()func1(pg);//penguin::fly()func2(&pg);//penguin::fly()getchar();return 0;
}
C++中的两种绑定方式(静态绑定、动态绑定)相关推荐
- java两种绑定方式_Javascript绑定事件的两种方式的区别
命名函数 function check(){ //code } 匿名函数 window.onload = function(){ //先获取元素对象,再绑定事件,绑定的是匿名函数不可重用 var bt ...
- link linux 跨设备,Linux中的两种link方式
Linux系统中包括两种链接方式:硬链接(hard link)和符号链接(symbolic link),其中符合链接就是所谓的软链接(soft link),那么两者之间到底有什么区别呢? inode ...
- Map集合中的两种取出方式keySet和entrySet
/*map集合中的两种取出方式:1.Set<k> keySet:将map集合中所有的键存入到Set集合,因为Set具备迭代器.所有可用迭代方式取出所有的键,再根据get方法,获取每一个键对 ...
- 1000个苹果要分到10个箱子中去 两种分析方式
前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名 ...
- 浅谈POE供电系统中PSE两种供电方式——终端跨度、中间跨度
标准的五类网线有四对双绞线但是在10M BASE-T和100M BASE-T中只用到其中的两对. IEEE80 2.3af允许两种用法: 1. 中间跨度法,信号线(1,2,3,6).电源线(4,5,7 ...
- java两种绑定方式_java两种单例模式用法分析
本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...
- Oracle中的两种验证方式:操作系统验证和密码文件验证,通过操作系统验证的方式解决客户端登录不了数据的问题
Oracle验证两种方式,操作系统验证,密码文件验证 启动密码文件验证 如果数据库登录方式是操作系统验证sys登录不需要用户名和密码就可以登录 C:\Documents and Settings\ww ...
- mysql中两次排序_MySQL中的两种排序方式: index和filesort
index :通过有序索引顺序扫描直接返回有序数据,不需要额外的排序,操作效率较高. filesort:通过对返回数据进行排序,filesort 并不代表通过磁盘文件排序,而是说明进行了一个排序操作, ...
- java中的uuid是啥,UUID在Java中的两种发作方式
需求: 集群环境下需要产生uuid,uuid的作用不言而喻 转发请注明出处:http://snv.iteye.com/ 环境: org.safehaus.jug jug 2.0.0 asl 或: or ...
最新文章
- 00075_BigInteger
- javascript 之 面向对象【理解对象】
- 判断扫码是支付宝还是微信
- SoundHound Inc. Programming Contest 2018[C. Ordinary Beauty]
- Linux: 系统配置 crond 和 crontab(有图有代码有真相!!!)
- java策略模式 工厂模式_策略模式和工厂模式搭配使用
- 当上项目经理才知道!linuxmysql执行sql文件命令
- PHP问题 —— The use statement with non-compound name
- php js 获取 客户端ip地址,JavaScript获取客户端IP的方法(新方法)
- C语言程序100例之C#版-008
- 三菱PLC与上位机进行通讯
- RHCE(DHCP报文)
- Word使用样式技巧:解决创建目录后出现的打印错误---超链接错误
- Word打开文件错误提示用文本恢复转换器打开文件
- 挑战华为社招:不止面试题,笔记源码统统都有,最强技术实现
- 【对象存储】关于阿里云OSS踩坑记录
- 本周AI热点回顾:和欧阳娜娜一起搞研发?强大的神经网络新算子involution,超越卷积、自注意力机制!...
- Ant design pro入坑指南
- 大家都可以学的制作个人网
- NAT的两种模式SNAT和DNAT介绍