zoukankan      html  css  js  c++  java
  • 函数的动态绑定和静态绑定

      先看一个例子:Widget类中有个虚函数和一个非虚函数。指针变量pWidget的值是NULL。通过指针调用非虚函数和虚函数。

    class Widget{
    public:
     virtual void virtual_flip(){
      cout << "virtual func" << endl;
     }
     
     void nonvirtual_flip(){
      cout << "nonvirtual func" << endl;
     }
    };
     
    int main(){
     Widget* pWidget = NULL;
     pWidget->nonvirtual_flip();
     pWidget->virtual_flip();
     return 0;
    }

      结果,编译通过,但是调用非虚函数能够正确运行,而调用虚函数则不行。

        先看看,编译器如何把虚拟函数调用重新改写的:调用pWidget->virtual_flip(),时,编译器会将其重新写成如下形式:
    (*(pWidget->vptr[1])(pWidget),其中1表示virtual_flip()在虚表中的索引。包含虚函数的类会在其对象中包含一个指向虚函数表的指针vptr(该指针在构造函数中设定),由于要到对象中取的vptr,所以当指针为空,则取该指针所指对象就会出错。
        而对于非虚函数的调用是在连接过程中将实际的函数地址填入即可(编译是分模块分别进行的),并不会到对象中去取。所以可以正确运行。
        同时要注意,类的非静态成员函数都隐含一个this指针,所以如果在nonvirtual_flip()内部要访问一个类的数据成员,那么传递的NULL指针就会出错。
  • 相关阅读:
    InfoPath 发布表单到SharePoint库报错
    在log4net中控制nhibernate输出
    微信扫一扫(wx.scanQRCode)功能新手可能遇到的问题
    3.Zookeeper的安装和配置(集群模式)
    1.配置HDFS HA (高可用)
    2.Zookeeper工作原理(详细)
    1.Zookeeper 定义与工作原理
    js 获取元素的几种方法
    弹出层居中
    XUACompatible
  • 原文地址:https://www.cnblogs.com/yplhh/p/4642032.html
Copyright © 2011-2022 走看看