zoukankan      html  css  js  c++  java
  • c++动态绑定与静态绑定

    C++为了支持多态性,采用了动态绑定和静态绑定

    相关概念:

    对象的静态类型:对象在声明时采用的类型,编译时确定

    对象的动态类型:目前所指对象的类型,在运行时确定

    class B
    {
    }
    class C : public B
    {
    }
    class D : public B
    {
    }
    D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D*
    B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D*
    C* pC = new C();
    pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C*

    静态绑定:绑定的对象是静态类型,其特性依赖于对象的静态类型,发生在编译期

    动态绑定:绑定的对象是动态类型,其特性依赖于对象的动态类型,发生在运行期

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

    pD->DoSomething()和pB->DoSomething()调用的是同一个函数吗?

    答案是不会。DoSomething是一个非虚函数,非虚函数是静态绑定的,即编译器在编译期间根据调用该函数的对象的静态类型来选择DoSomething的版本

    pD的静态类型是D*,那么编译器在处理pD->DoSomething()的时候会将它指向D::DoSomething()

    pB的静态类型是B*,那么编译器在处理pB->DoSomething()的时候会将它指向B::DoSomething()

    pD->vfun()和pB->vfun()调用的是同一个函数吗?

    答案是会。vfun是一个虚函数,它是动态绑定的,即它绑定的是对象的动态类型,即在程序运行期间根据对象的动态类型学则vfunc的版本

    pB和pD虽然静态类型不同,但是他们同时指向一个对象,他们的动态类型是相同的,都是D*,所以调用的是同一个函数:D::vfun()

    只有虚函数才使用的是动态绑定,其他的全部都是静态绑定

    特别需要注意的是,虚函数是动态绑定的,但是为了执行效率,虚函数的缺省参数是静态绑定的

    class B
    {
     virtual void vfun(int i = 10);
    }
    class D : public B
    {
     virtual void vfun(int i = 20);
    }
    D* pD = new D();
    B* pB = pD;
    pD->vfun();
    pB->vfun();

    缺省参数是静态绑定的,pD->vfun()时,pD的静态类型是D*,所以它的缺省参数应该是20,pB的静态类型是B*,所以pB->vfun()的缺省参数应该是10

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4359368.html
Copyright © 2011-2022 走看看