C++ 继承,虚继承(内存结构)详解 普通的公有继承1234567891011121314151617181920classtest1{public:test1(inti) :num1(i) {}private:intnum1;};classtest2 :publictest1{public:test2(inti,intj) : test1(i), num2(j){}private:intnum2;};voidmain(){test2 t2(1,2);}(test2内存结构)查看内存发现父类在子类的上面多重继承在原有的代码基础上增加了test3类test3类继承了 test2和test1123456789101112131415161718192021222324252627classtest1{public:test1(inti) :num1(i) {}private:intnum1;};classtest2{public:test2(inti) : num2(i){}private:intnum2;};classtest3 :publictest2 ,publictest1{public:test3(inti,intj,intk) :test1(i), test2(j),num3(k) {}private:intnum3;};voidmain(){test3 t3(1, 2, 3);}(test3内存地址 ) 依旧是父类在子类上但是现在有两个父类为什么test2在test1上?这和我们的继承顺序有关 我们先继承了test2又继承了test1 更换内存继承顺序 内存的情况也会有所变化虚继承1234567891011121314151617181920classtest1{public:test1(inti) :num1(i) {}private:intnum1;};classtest2:virtualpublictest1{public:test2(inti,intj) :test1(i), num2(j){}private:intnum2;};voidmain(){test2 t2(1, 2);}(t2的内存) 我们发现虚继承以后父类成员数据在子类成员数据下面了 首地址处莫名其妙多了四字节这四字节就是我们的虚基类表的地址跟随虚继承表 其中存储了本类距离父类对象的差值 通过差值能够找到父类对象我们再看这个内存0x0082fbd8是t2的首地址 0x0082fbe0是父类的位置0x0082fbd8 - 0x0082fbe0 8就是本类距离父类对象的差值虚继承(菱形继承)123456789101112131415161718192021222324252627282930313233343536classtest1{public:test1(inti) :num1(i) {}private:intnum1;};classtest2:virtualpublictest1{public:test2(inti,intj) :test1(i), num2(j){}private:intnum2;};classtest3 :virtualpublictest1{public:test3(inti,intj) :test1(i), num3(j){}private:intnum3;};classtest4 :publictest2,publictest3{public:test4(inti,intj,intk) :test1(i),test2(i,j), test3(i,j),num4(k){}private:intnum4;};voidmain(){test4 t4(1, 2,3);}test4的内存 我们看到 t2和t3都有自己的虚基类表地址 记录了自己和父类的偏移两个虚基类表的内容现在我们计算一下 到爷爷类的差值是否正确0x00FAFD50 - 0x00fafd3c 140x00FAFD50 - 0x00fafd44 C总结本篇文章就到这里了希望能够给你带来帮助