守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 814|回复: 0

[C++] C++静态绑定与动态绑定

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51788
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-16 13:55:19 | 显示全部楼层 |阅读模式

    目前我参与的项目中使用了大量的接口调用,大量的继承(多重继承,多重派生等),其中的大部分都是使用了C++语言的动态绑定特性.既然有动态绑定,哪就相应的肯定有静态绑定,今晚复习了下这个特性.

    静态绑定与动态绑定

    静态绑定又名前期绑定(early binding),绑定的是对象的静态类型发生在编译期.动态绑定又名后期绑定(late binding),绑定的是对象的动态类型,发生在运行期.简单的说就是:静态绑定在编译完成后已经确定,动态绑定则需要在运行的时候才确定.考虑如下继承:

    1. class B{
    2. public:
    3.     void testA(){printf("class B testA()\n");};
    4.     virtual void testB(){printf("class B testB()\n");};
    5. };

    6. class D:public B{
    7. public:
    8.     void testA(){printf("class D testA()\n");};
    9.     virtual void testB(){printf("class D testB()\n");};
    10. };

    11. int main(int argc, const char * argv[])
    12. {

    13.     // insert code here...
    14.    
    15.     D x;
    16.     B* pB = &x;
    17.     D* pD = &x;
    18.     printf("testing non-virturl\n");
    19.     pB->testA();
    20.     pD->testA();
    21.     printf("testing virturl\n");
    22.     pB->testB();
    23.     pD->testB();
    24.     return 0;
    25. }
    复制代码
    运行后输出如下:

    1. testing non-virturl
    2. class B testA()
    3. class D testA()
    4. testing virturl
    5. class D testB()
    6. class D testB()
    复制代码
    pB,pD虽然都指向派生类D,但是调用non-virtual函数(非虚成员函数)的时候pB调用到基类B的定义.调用virtual函数(虚函数)的时候则均是调用到派生类D的定义.原因在于:非虚函数属于静态绑定,所以类B或者D 指针调用非虚函数的时候 均是调用到自身的定义.虚函数属于动态绑定,无论指针类型是基类B还是派生类D,调用到的都取决于调用的那个对象的类型.往后C++编程中应当避免
    • 重新定义非虚成员类
    • 多重继承中的指针频繁转换
    • 接口基类不应该有非虚函数(也就是全部设置位纯虚函数)
    这篇日志系Effective C++读书笔记,参考其中第36,37条款.
    本文来自:http://shadowkong.com/archives/1818


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-18 23:03 , Processed in 0.046132 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表