zoukankan      html  css  js  c++  java
  • C++ 虚函数表 单继承

            本文研究单继承情况下,c++对象的虚函数表的具体情况。

            假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。

    测试的代码如下:

    #include<iostream>
    using namespace std;
    class  A
    {
    public:
            virtual void fun1()
            {
                    cout<<"A::fun1"<<endl;
            }
    
    };
    
    class B:public A
    {
    public:
            virtual void  fun2()
            {
                    cout<<"B::fun2"<<endl;
            }
    
            virtual void fun1()
            {
                    cout<<"B::fun1"<<endl;
            }
    
    };
    
    typedef void (*Fun)(void);
    int main(int argc, char* argv[])
    {
            B   b;
    
            cout<<"虚函数表指针的地址为:"<<(int *)(&b)<<endl;
            cout<<"虚函数表的地址为:"<<*(int *)(&b)<<endl;
            cout<<"第一个虚函数fun1的地址为:"<<(int *) *(int *)(&b)<<endl;
    
    
            Fun  fun1=( Fun) ( *(int *) *(int *)(&b));
            fun1();
    
            cout<<"第二个虚函数fun2的地址为:"<<  (int *)    ((int *) (*(int *)(&b))+1) << endl;
            Fun fun2=(Fun) (* ((int *) (*(int *)(&b))+1));
            fun2();
            return 0;
    }
    运行结果:

    虚函数表指针的地址为:0xbfa9a77c
    虚函数表的地址为:134515592
    第一个虚函数fun1的地址为:0x8048b88
    B::fun1
    第二个虚函数fun2的地址为:0x8048b8c
    B::fun2

           测试代码说明:

           虚函数表指针             (int *)(&b)

           虚函数表地址           *(int *)(&b)

           虚函数表的第一个元素,也就是指向fun1的指针  (int * )(*(int *)(&b))

           虚函数表的第二个元素,也就是指向fun2的指针  (int * )(*(int *)(&b)) + 1)


    在这种单继承的情况下,如果有虚函数表,那么只有一个虚函数表,并且按照虚函数声明的顺序顺序排列,派生类的虚函数紧接着基类的虚函数排列,B的虚函数表结果如下图所示:

                          


  • 相关阅读:
    Filter 和 interceptor 的区别
    JAVA基础知识|Optional
    CentOS 7安装MariaDB 10详解以及相关配置
    Linux系统zookeeper环境搭建(单机、伪分布式、分布式)
    Java设计模式——模板方法模式
    Java设计模式——装饰模式
    Java设计模式——观察者模式
    Java设计模式——代理模式
    Java设计模式——适配器模式
    Java设计模式——策略模式
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172427.html
Copyright © 2011-2022 走看看