服务器之家

服务器之家 > 正文

C++ 继承,虚继承(内存结构)详解

时间:2022-01-10 15:15     来源/作者:很酷很爱笑

普通的公有继承

class test1
{
public:
  test1(int i) :num1(i) {}
private:
  int num1;
};
class test2 : public test1
{
public:
  test2(int i,int j) : test1(i), num2(j)
  {
  }
private:
  int num2;
};
void main()
{
  test2 t2(1,2);
}

(test2内存结构)查看内存发现父类在子类的上面

C++ 继承,虚继承(内存结构)详解

 

多重继承

在原有的代码基础上增加了test3类

test3类继承了 test2和test1

class test1
{
public:
  test1(int i) :num1(i) {}
private:
  int num1;
};
class test2
{
public:
  test2(int i) : num2(i)
  {
  }
private:
  int num2;
};
class test3 :public test2 ,public test1
{
public:
  test3(int i, int j,int k) :test1(i), test2(j),num3(k) {}
private:
  int num3;
};
void main()
{
  test3 t3(1, 2, 3);
}

(test3内存地址 ) 依旧是父类在子类上

但是现在有两个父类为什么test2在test1上?

这和我们的继承顺序有关 我们先继承了test2又继承了test1 更换内存继承顺序 内存的情况也会有所变化

C++ 继承,虚继承(内存结构)详解

 

虚继承

class test1
{
public:
  test1(int i) :num1(i) {}
private:
  int num1;
};
class test2: virtual public test1
{
public:
  test2(int i,int j) :test1(i), num2(j)
  {
  }
private:
  int num2;
};
void main()
{
  test2 t2(1, 2);
}

(t2的内存) 我们发现虚继承以后父类成员数据在子类成员数据下面了 首地址处莫名其妙多了四字节

这四字节就是我们的虚基类表的地址

C++ 继承,虚继承(内存结构)详解

跟随虚继承表 其中存储了本类距离父类对象的差值 通过差值能够找到父类对象

C++ 继承,虚继承(内存结构)详解

我们再看这个内存0x0082fbd8是t2的首地址 0x0082fbe0是父类的位置

0x0082fbd8 - 0x0082fbe0 == 8

就是本类距离父类对象的差值

C++ 继承,虚继承(内存结构)详解

 

虚继承(菱形继承)

class test1
{
public:
  test1(int i) :num1(i) {}
private:
  int num1;
};
class test2: virtual public test1
{
public:
  test2(int i,int j) :test1(i), num2(j)
  {
  }
private:
  int num2;
};
class test3 :virtual public test1
{
public:
  test3(int i, int j) :test1(i), num3(j){}
private:
  int num3;
};
class test4 :public test2, public test3
{
public:
  test4(int i, int j, int k) :test1(i),test2(i,j), test3(i,j),num4(k)
  {
  }
private:
  int num4;
};
void main()
{
  test4 t4(1, 2,3);
}


test4的内存 我们看到 t2和t3都有自己的虚基类表地址 记录了自己和父类的偏移

C++ 继承,虚继承(内存结构)详解

两个虚基类表的内容

现在我们计算一下 到爷爷类的差值是否正确

0x00FAFD50 - 0x00fafd3c == 14

0x00FAFD50 - 0x00fafd44 == C

C++ 继承,虚继承(内存结构)详解

 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/weixin_45012273/article/details/120401539

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部

1281
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40