1.1 解决问题利用虚基类
1.2 sheepTuo内部结构
1.2.1 vbptr 虚基类指针
1.2.2 指向一张 虚基类表
1.2.3 通过表找到偏移量
1.2.4 找到共有的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理