两种绑定方式

静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类。

动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类。

需要注意:

  1. 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;
}
  1. 必须在程序中显式地指出动态绑定。

动态绑定的实现

动态绑定的实现条件:

  1. 类的定义中成员函数声明为虚函数
  2. 通过引用或指针来访问对象的虚函数

virtual声明需要注意:

  1. 一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,…)中对其重定义的成员函数均为虚函数
  2. 重定义: 对派生类中定义的成员函数, 其函数名, 参数个数和类型以及返回值类型与基类的某个虚成员函数相同(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++中的两种绑定方式(静态绑定、动态绑定)相关推荐

  1. java两种绑定方式_Javascript绑定事件的两种方式的区别

    命名函数 function check(){ //code } 匿名函数 window.onload = function(){ //先获取元素对象,再绑定事件,绑定的是匿名函数不可重用 var bt ...

  2. link linux 跨设备,Linux中的两种link方式

    Linux系统中包括两种链接方式:硬链接(hard link)和符号链接(symbolic link),其中符合链接就是所谓的软链接(soft link),那么两者之间到底有什么区别呢? inode ...

  3. Map集合中的两种取出方式keySet和entrySet

    /*map集合中的两种取出方式:1.Set<k> keySet:将map集合中所有的键存入到Set集合,因为Set具备迭代器.所有可用迭代方式取出所有的键,再根据get方法,获取每一个键对 ...

  4. 1000个苹果要分到10个箱子中去 两种分析方式

    前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名 ...

  5. 浅谈POE供电系统中PSE两种供电方式——终端跨度、中间跨度

    标准的五类网线有四对双绞线但是在10M BASE-T和100M BASE-T中只用到其中的两对. IEEE80 2.3af允许两种用法: 1. 中间跨度法,信号线(1,2,3,6).电源线(4,5,7 ...

  6. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  7. Oracle中的两种验证方式:操作系统验证和密码文件验证,通过操作系统验证的方式解决客户端登录不了数据的问题

    Oracle验证两种方式,操作系统验证,密码文件验证 启动密码文件验证 如果数据库登录方式是操作系统验证sys登录不需要用户名和密码就可以登录 C:\Documents and Settings\ww ...

  8. mysql中两次排序_MySQL中的两种排序方式: index和filesort

    index :通过有序索引顺序扫描直接返回有序数据,不需要额外的排序,操作效率较高. filesort:通过对返回数据进行排序,filesort 并不代表通过磁盘文件排序,而是说明进行了一个排序操作, ...

  9. java中的uuid是啥,UUID在Java中的两种发作方式

    需求: 集群环境下需要产生uuid,uuid的作用不言而喻 转发请注明出处:http://snv.iteye.com/ 环境: org.safehaus.jug jug 2.0.0 asl 或: or ...

最新文章

  1. 00075_BigInteger
  2. javascript 之 面向对象【理解对象】
  3. 判断扫码是支付宝还是微信
  4. SoundHound Inc. Programming Contest 2018[C. Ordinary Beauty]
  5. Linux: 系统配置 crond 和 crontab(有图有代码有真相!!!)
  6. java策略模式 工厂模式_策略模式和工厂模式搭配使用
  7. 当上项目经理才知道!linuxmysql执行sql文件命令
  8. PHP问题 —— The use statement with non-compound name
  9. php js 获取 客户端ip地址,JavaScript获取客户端IP的方法(新方法)
  10. C语言程序100例之C#版-008
  11. 三菱PLC与上位机进行通讯
  12. RHCE(DHCP报文)
  13. Word使用样式技巧:解决创建目录后出现的打印错误---超链接错误
  14. Word打开文件错误提示用文本恢复转换器打开文件
  15. 挑战华为社招:不止面试题,笔记源码统统都有,最强技术实现
  16. 【对象存储】关于阿里云OSS踩坑记录
  17. 本周AI热点回顾:和欧阳娜娜一起搞研发?强大的神经网络新算子involution,超越卷积、自注意力机制!...
  18. Ant design pro入坑指南
  19. 大家都可以学的制作个人网
  20. NAT的两种模式SNAT和DNAT介绍

热门文章

  1. 文本类控件 (TextView的介绍)
  2. python pip换源方法
  3. 关于acm的新手一些问题
  4. Python20-Day05
  5. Go 学习笔记(14)— 结构体定义、实例化、初始化、匿名结构体、结构体访问、结构体作为形参、结构体指针
  6. oracle数据库连接设置配置文件
  7. ubuntu下安装 python 常用软件
  8. mysql 常用sql与命令
  9. lists,tuples and sets of Python
  10. Swift中的问号?和感叹号!