zoukankan      html  css  js  c++  java
  • 小议虚函数的原理

    假设一个接口类IX,然后一个具体类CA继承了这个接口。
    // Abstract interfaces
    interface IX
    {
     virtual void __stdcall Fx1() = 0 ;
     virtual void __stdcall Fx2() = 0 ;
    } ;

    // Interface implementation
    class CA : public IX,
    {
    public:

     // Implement interface IX.
     virtual void __stdcall Fx1() {cout << "CA::Fx1" << endl ;}
     virtual void __stdcall Fx2() {cout << "CA::Fx2" << endl ;}
    } ;

    int main()

    {

     CA* pA = new CA ;
     IX* pIX = pA;
     pIX->Fx1() ;
     pIX->Fx2() ;

    }

    熟悉虚函数的人必定晓得输出结果是什么。。。那C++背后在做什么呢?让我们剖析main函数里的代码。

    0. 首先需要声明的是,以虚函数定义某个类后,对象内部将构建一个虚函数表,用以保存所有定义为虚函数的函数地址,并令一个vtbl指针指向虚函数表。

    1. CA* pA = new CA ;
        pA中的vtbl指向的虚函数表将填充具体的函数地址。其虚函数表保存了两个虚函数的地址( &Fx1()和&Fx2() )

    2.  IX* pIX = pA;
        pIX指向了pA中基类的部分,也就有了访问pA vtbl的权限。

    3. pIX->Fx1() ;
        调用虚函数表中对应函数指针&Fx1,也就调用了pA中的函数Fx1。

    4. pIX->Fx2() ;
       调用虚函数表中对应函数指针&Fx2,也就调用了pA中的函数Fx2。

  • 相关阅读:
    浮动广告
    jQuery给table添加行和删除行
    oracle优化方式和sql标准
    使用JavaScript中的ActiveXObject填充并设置Excel格
    打印相关的js
    利用js导出Excel
    Oracle左外连接和右外连接的写法
    天气预报抓取的方法和源代码(包括从IP获取)
    algorithm
    ungetc
  • 原文地址:https://www.cnblogs.com/dawn/p/1721402.html
Copyright © 2011-2022 走看看