zoukankan      html  css  js  c++  java
  • 虚基类的内部工作原理

    1。对照表来看

    代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    class Animal
    {
    public:
    
        int m_Age;
    };
    //虚基类 Sheep
    class Sheep:virtual public Animal
    {
    };
    //虚基类 Tuo
    class Tuo: virtual public Animal
    {};
    class SheepTuo :public Sheep, public Tuo
    {
    };
    void test01()
    {
        SheepTuo st;
        st.Sheep::m_Age = 10;
        st.Tuo::m_Age = 20;
    
        cout << st.Sheep::m_Age << endl;    //20 因为指向的时同一个地址
        cout << st.Tuo::m_Age << endl;  //20
        cout << st.m_Age << endl;   //20 可以直接访问m_Age数据 原因时因为没有二义性了
    }
    //通过地址 找到偏移量
    //内部工作原理
    void test02()
    {
        SheepTuo st;
        st.m_Age = 100;
        //找Sheep的偏移量操作
        // &st 对照类的模型表来看 先取到地址 
        //(int *)&st //转成int* 是为了改变步长 
        // *(int *)&st  //取* 找到虚基类表
        // (int *) * (int *)&st  //去到虚基类表的步长
        // (int *) * (int *)&st + 1  //取到虚基类表的步长 + 1 获取到Sheep数组的第1位
        // (int *)((int *) * (int *)&st + 1)  //取到步长后再加int *  此时地址指向偏移量所在的位置
        // *(int *)((int *) * (int *)&st + 1)  //取到数据所在的位置 前面加* 获取到值 如图所以 Sheep的数组为 0:0, 1:8
        cout << *(int*)((int*)*(int*)&st + 1) << endl;  //获取到Sheep的偏移量为 8
    
        //找Tuo的偏移量
        //(int *)&st + 1;   //先取到地址 改变步长后 找Tuo虚基类表的位置为 改变步长后+1 找到Tuo的虚基类表的地址
        // *((int *)&st + 1)  //根据Tuo的虚基类表的地址取* 找到Tuo的虚基类表
        // (int*)*((int *)&st + 1) //根据Tuo虚继类表取步长 获取数组的地址
        // *((int*)*((int *)&st + 1)+1)  //根据数组的地址 取第1位的地址 取* 获得偏移量
        cout << *((int*)*((int*)&st + 1) + 1) << endl;  //获取Tuo的便宜量为 4
        cout << *((int*)((int*)*((int*)&st + 1) + 1)) << endl; //教程为这个 答案也是4
    
        //输出m_Age
        //  (char *)&st是 0的位置 + 8  然后强转成Animal类
        cout << ((Animal*)((char*)&st + *(int*)((int*)*(int*)&st + 1)))->m_Age << endl;
    
    }
    int main()
    {
        test02();
        //test01();
        system("Pause");
        return 0;
    }

    结果:

     

  • 相关阅读:
    hdu1078 记忆化dfs
    hdu1142 dij+记忆化深搜
    UVA 11374 dijkstra预处理+枚举
    poj1502 单源最短路径
    hdu1814 2-SAT 暴力搜
    macos 10.15.1 pip3安装提示权限不足
    将安装器信息下载到目标卷宗失败
    Mac修改默认python版本
    努力吧,少年
    Implement strStr() 字符串匹配
  • 原文地址:https://www.cnblogs.com/yifengs/p/15177679.html
Copyright © 2011-2022 走看看