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。

  • 相关阅读:
    ABP框架应用-MySQL数据库集成
    redis初识
    MySQL高级学习笔记
    Linux安装apache
    学习jvm(一)--java内存区域
    HashTable、HashMap与ConCurrentHashMap源码解读
    Linux安装禅道项目管理软件
    设计模式之六大原则
    设计模式之策略模式
    设计模式之分类
  • 原文地址:https://www.cnblogs.com/dawn/p/1721402.html
Copyright © 2011-2022 走看看