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;
    }

    结果:

     

  • 相关阅读:
    怎样练习一万小时
    新闻的未来
    有些人无缘再见,却一生想念
    媒体该如何展示事实之美?
    传统媒体:广告都去哪儿了?
    一线从业者干货分享:不做“忧伤”的媒体人
    整理者与信息平台
    把媒体当手段还是当目的?
    媒体人转身,转身去哪里?
    腾讯新闻的海量服务
  • 原文地址:https://www.cnblogs.com/yifengs/p/15177679.html
Copyright © 2011-2022 走看看