澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2019-11-09 21:04 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

动态绑定与静态绑定

动态绑定与静态绑定,动态绑定静态绑定

为了扶持c 的多态性,才用了动态绑定和静态绑定。领悟她们的界别有利于越来越好的知情多态性,以至在编制程序的经过中防止犯错误。

须要精晓多个名词:

1、对象的静态类型:对象在证明时采纳的种类。是在编写翻译期明确的。

2、对象的动态类型:如今所指对象的项目。是在运营期决定的。对象的动态类型能够改造,然而静态类型不或许改观。

 

有关目的的静态类型和动态类型,看二个示范:

 1 class B
 2 {
 3 }
 4 class C : public B
 5 {
 6 }
 7 class D : public B
 8 {
 9 }
10 D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D*
11 B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D*
12 C* pC = new C();
13 pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C*

3、静态绑定:绑定的是目的的静态类型,某本性(比方函数卡塔 尔(英语:State of Qatar)信任于对象的静态类型,爆发在编写翻译期。

4、动态绑定:绑定的是目的的动态类型,某脾气(比方函数卡塔 尔(阿拉伯语:قطر‎依赖于对象的动态类型,发生在运营期。

 1 class B
 2 {
 3     void DoSomething();
 4     virtual void vfun();
 5 }
 6 class C : public B
 7 {
 8     void DoSomething();//首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。
 9     virtual void vfun();
10 }
11 class D : public B
12 {
13     void DoSomething();
14     virtual void vfun();
15 }
16 D* pD = new D();
17 B* pB = pD;

让咱们看一下,pD->DoSomething()和pB->DoSomething()调用的是同三个函数吗?

不是的,就算pD和pB都对准同三个指标。因为函数DoSomething是八个no-virtual函数,它是静态绑定的,也便是编写翻译器会在编写翻译期依照目的的静态类型来选用函数。pD的静态类型是D*,那么编写翻译器在管理pD->DoSomething()的时候会将它指向D::DoSomething()。同理,pB的静态类型是B*,这pB->DoSomething()调用的正是B::DoSomething()。

让大家再来看一下,pD->vfun()和pB->vfun()调用的是同一个函数吗?
科学。因为vfun是一个虚函数,它动态绑定的,也正是说它绑定的是指标的动态类型,pB和pD即便静态类型分化,可是她们还要针对八个对象,他们的动态类型是相近的,都以D*,所以,他们的调用的是同三个函数:D::vfun()。

上面都以指向对象指针的景色,对于援用(reference卡塔尔国的图景风流罗曼蒂克致适用。

澳门威斯尼斯全部网址,指南针和援引的动态类型和静态类型恐怕会不平等,可是对象的动态类型和静态类型是相通的。
D D;
D.DoSomething()和D.vfun()长久调用的都以D::DoSomething()和D::vfun()。

有关那一个事动态绑定,那多少个事静态绑定,有篇文章总括的不得了好:
自身总计了一句话:唯有虚函数才使用的是动态绑定,别的的整个是静态绑定。最近笔者还并没有发觉不适用那句话的,假如有错误,希望您能够提出来。

为了协助c 的多态性,才用了动态绑定和静态绑定。领会...

本文由澳门威利斯人发布于网络资讯,转载请注明出处:动态绑定与静态绑定

关键词: 澳门威利斯人