为了支持c++的多态性,才用了动态绑定和静态绑定。

1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。

2、对象的动态类型:目前所指对象的声明。在运行期决定。对象的动态类型可以更改,但是静态类型无法更改。

关于对象的静态类型和动态类型,看一个示例:

class A{};
class B: public A{};
class C: public A{}; int main()
{
C *pc=new C();//pc的静态类型是它声明的类型C*,动态类型也是C*
A *pa=pc;//pa的静态类型是它声明的类型A*,pa的动态类型所指向的对象pc的类型A*
B *pb=new B();
pa=pb;//pa的动态类型是可以更改的,现在它的动态类型是B*
return ;
}

3、静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。

4、动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。

class A
{
public:
void dosomething()
{
cout<<"A"<<endl;
} virtual void fun()
{
cout<<"virtual A"<<endl;
}
};
class B: public A
{
public:
void dosomething()
{
cout<<"B"<<endl;
} virtual void fun()
{
cout<<"virtual B"<<endl;
}
};
class C: public A
{
public:
void dosomething()
{
cout<<"C"<<endl;
} virtual void fun()
{
cout<<"virtual C"<<endl;
}
}; int main()
{
C *pc=new C();//pc的静态类型是它声明的类型C*,动态类型也是C*
pc->dosomething(); // C
pc->fun(); // virtual C
A *pa=pc;//pa的静态类型是它声明的类型A*,pa的动态类型所指向的对象pc的类型A*
pa->dosomething(); // A  ①
pa->fun(); // virtual C
B *pb=new B();
pb->dosomething(); //B
pb->fun(); // virtual B
pa=pb;//pa的动态类型是可以更改的,现在它的动态类型是B*
pa->dosomething(); // A  ②
pa->fun(); // virtual B
return ;
}

  dosomething()是一个非虚函数,它是静态绑定的,也就是在编译的时候根据对象的静态类型来选择函数,所以,pa、pb、pc调用的都是自己的的dosomething()函数,但对于①中的pa的fun()函数和②中的pa的fun()函数,因为fun()为虚函数,它们绑定的是动态对象,所以①的pa调用的是pc的fun()函数,②的pa调用的是pb的fun()函数。

需要注意的是:

  当缺省参数和虚函数一起出现的时候情况就有点复杂,因为虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的。

class A
{
public:
virtual void fun(int i=)
{
cout<<"virtual A "<<i<<endl;
}
};
class B: public A
{
public:
virtual void fun(int i=)
{
cout<<"virtual B "<<i<<endl;
}
}; int main()
{
B *b=new B();
A *a=b;
b->fun();//virtual B 20
a->fun();//virtual B 10
return ;
b->fun()、a->fun()调用的都是b的fun()函数,但是缺省函数是静态绑定的,所以a->fun()调用的是a的虚函数fun()里面的缺省值10,b->fun()调用的是b的虚函数fun()里面的缺省值20。
只有涉及虚函数的地方才存在动态绑定!!!!
参考博客:https://blog.csdn.net/chgaowei/article/details/6427731

c++的动态绑定和静态绑定的更多相关文章

  1. 深入理解C++的动态绑定和静态绑定【转】

    转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...

  2. c++动态绑定与静态绑定

    C++为了支持多态性,采用了动态绑定和静态绑定 相关概念: 对象的静态类型:对象在声明时采用的类型,编译时确定 对象的动态类型:目前所指对象的类型,在运行时确定 class B { } class C ...

  3. 再次探讨C++的动态绑定和静态绑定

    以前在学习C++的时候,对动态绑定和静态绑定的理解是:静态绑定是编译时决定的,非虚函数基本都是静态绑定:而动态绑定用于虚函数,是为了实现多态.这样理解没什么大的问题,但我一直疑惑的是,既然静态绑定可以 ...

  4. 关于继承的基本知识,方法重写,final和abstract的使用, 动态绑定和静态绑定的知识

    一.继承: 涉及关键字: extends(继承) super final abstract 特点: 1.类与类之间可以用 XX是XX来描述 , 那么他们之间就存在继承关系.  2.Java中不支持多继 ...

  5. 【转】深入理解C++的动态绑定和静态绑定 & 不要重定义虚函数中的默认参数

    为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2 ...

  6. C++ 多态Polymorphism 介绍+动态绑定、静态绑定

    什么是多态? 多态(polymorphism)一词最初来源于希腊语polumorphos,含义是一种物质的多种形态. 在专业术语中,多态是一种运行时绑定机制(run-time binding) ,通过 ...

  7. 深入理解C++的动态绑定和静态绑定

    转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...

  8. c++的动态绑定和静态绑定及多态的实现原理(摘)

    C++多态的实现原理 为了支持c++的多态性,才用了动态绑定和静态绑定.理解它们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误. 需要理解四个名词:对象的静态类型:对象在声明时采用的类型. ...

  9. Java动态绑定和静态绑定-多态

    一.问题 Java方法调用过程中,Jvm是如何知道调用的是哪个类的方法?Jvm又是如何处理?   二.概念 a.当子类和父类(接口和实现类)存在同一个方法时,子类重写父类(接口)方法时,程序在运行时调 ...

随机推荐

  1. 6-具体学习git--分支冲突,rebase|| stash 临时修改

    rebase很危险. https://morvanzhou.github.io/tutorials/others/git/

  2. IntelliJ IDEA 2017版 spring-boot2.0.4+mybatis反向工程;mybatis+springboot逆向工程

    一.搭建环境 采用IDE自动建立项目方式 然后,next next,配置导入依赖包 项目就生成了,在项目下导入配置文件GeneratorMapper.xml(项目结构如图所示) 配置文档,建立数据库和 ...

  3. MongoDB-环境搭建

    1.下载并安装MongoDB服务 下载地址:mongodb-win32-x86_64-2008plus-ssl-3.2.8-signed 可直接运行mongod命令启动MongoDB服务器,也可以将M ...

  4. issubclass ,isinstance,反射

    issubclass() 函数 issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类. 语法 以下是 issubclass() 方法的语法: issubc ...

  5. 2018-01-13 view绘制流程-activity启动流程-window-decorView-ViewRootImpl关系

    1.activity启动流程: https://www.jianshu.com/p/927ca995bca6 http://blog.csdn.net/qian520ao/article/detail ...

  6. eclipse中ctrl+K失效

    从昨天开始eclipse中Ctrl+d和Ctrl+K就失效了,简直无法忍受 解决方案: Window --> preferences --> General --> keys

  7. java如何编写下载功能

    @RequestMapping("/downLoadFailRecord") public ModelAndView downLoadFailRecord( HttpServlet ...

  8. web-day15

    第15章WEB15-AJAX和JQuery案例篇 今日任务 使用AJAX完成用户名的异步校验 使用JQuery完成用户名异步校验 使用JQuery完成商品信息模糊显示 使用JQuery完成省市联动效果 ...

  9. hdu 5074 相邻数和最大dp

    http://acm.hdu.edu.cn/showproblem.php?pid=5074 给定一个序列 有些位数未知,给你所有两个数连续所得到的能量,问你怎么安排数字使得总能量最大 二维dp,dp ...

  10. AngularJS 指令中的 replace:true

    默认值是fasle,模板会被当作子元素插入到调用此指令的元素内部. <my-directive></my-directive> myModule.directive(" ...