• 菱形继承问题以及解决


    1.1     解决问题利用虚基类

    1.2     sheepTuo内部结构

    1.2.1     vbptr 虚基类指针

    1.2.2     指向一张 虚基类表

    1.2.3     通过表找到偏移量

    1.2.4     找到共有的数据

    #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;
    	cout << st.Tuo::m_Age << endl;
    	cout << st.m_Age << endl; //可以直接访问,原因已经没有二义性的可能了,只有一份m_Age
    }
    
    //通过地址 找到 偏移量
    //内部工作原理
    void test02()
    {
    	SheepTuo st;
    	st.m_Age = 100;
    
    	//找到Sheep的偏移量操作
    	//cout<< *(int *)((int *)*(int *)&st + 1) << endl;
    
    	cout << *(int*)((int*)*(int *)&st + 1) << endl;
    
    	//找到Tuo的偏移量
    	cout << *((int *)((int *)*((int *)&st + 1) + 1)) << endl;
    	
    	//输出Age
    	cout << ((Animal*)((char *)&st + *(int*)((int*)*(int *)&st + 1)))->m_Age << endl;
    
    }
    
    int main(){
    
    	//test01();
    	test02();
    
    	system("pause");
    	return EXIT_SUCCESS;
    }
    

      

  • 相关阅读:
    mysql批量替换指定字符串
    php中英字符串截取
    比较两个JSON字符串是否完全相等
    Java FastJson 介绍
    线程池
    DBUS及常用接口介绍
    在Mac中如何正确地设置JAVA_HOME
    base64 原理
    sizeof与strlen的区别
    Kubernetes 部署失败的 10 个最普遍原因
  • 原文地址:https://www.cnblogs.com/Malphite/p/14465724.html
Copyright © 2020-2023  润新知