博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++动态绑定和静态绑定
阅读量:2383 次
发布时间:2019-05-10

本文共 1464 字,大约阅读时间需要 4 分钟。

为了支持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 0;}

 

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

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

复制代码

class A{public:    void dosomething()    {        cout<<"A"<
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 0;}

复制代码

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

需要注意的是:

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

 

复制代码

class A{public:    virtual void fun(int i=10)    {        cout<<"virtual A "<<
fun();//virtual B 20 a->fun();//virtual B 10 return 0;} 

复制代码

b->fun()、a->fun()调用的都是b的fun()函数,但是缺省函数是静态绑定的,所以a->fun()调用的是a的虚函数fun()里面的缺省值10,b->fun()调用的是b的虚函数fun()里面的缺省值20。只有涉及虚函数的地方才存在动态绑定!!!!参考博客:https://blog.csdn.net/chgaowei/article/details/6427731
你可能感兴趣的文章
花4万学代码,工资却只有5千,这个程序员做的..
查看>>
新手网站建设指南(2)
查看>>
新手网站建设优化,这些网站为你提供数之不尽的免费素材!(3)
查看>>
HTML特殊字符显示(常用到的特殊符号,箭头相关,数学相关,标点,符号相关等)...
查看>>
40岁的程序员找不到工作,原来码农真的是碗青春饭
查看>>
2018年前端性能优化总结,这也是我做程序员的第五个年头了
查看>>
前端进阶(三)从0到1学AJAX,这篇就够了!
查看>>
强大的CSS:实现平行四边形布局效果
查看>>
强大的CSS:滤镜和混合模式处理的图片如何上传下载?
查看>>
强大的CSS:var变量的局部作用域(继承)特性
查看>>
强大的CSS: 使用“变量种子计数器”扩展动画更多可能性
查看>>
强大的CSS:focus-visible伪类真的太6了!
查看>>
强大的CSS:3种姿势实现26个英文字母的案例
查看>>
强大的CSS:placeholder-shown伪类实现Material Design占位符交互效果
查看>>
强大的CSS:图形绘制合集,方便你我!
查看>>
强大的CSS:scroll-snap滚动事件停止及元素位置检测
查看>>
程序员30岁前,月薪达不到30K,该何去何从?
查看>>
只要记住这五点,学习任何新编程语言都不是问题
查看>>
常见的前端开发CSS 面试题及回答策略
查看>>
缺前端是假的,缺优秀前端是真的
查看>>