C++类成员内存分布

 

目录

1、工具准备

2、普通类

3、含有虚函数的类

4、普通继承

5、父类含有虚函数的继承

6、父类和子类都含有虚函数的继承

7、普通的多继承

8、父类含有虚函数的多继承

9、普通的虚多继承

10、父类含有虚函数的虚多继承

11、既有虚继承又有普通继承

12、简单总结



1、工具准备

工欲善其事必先利其器,类成员查看我们使用VS中的工具进行。

vs中用快捷键Alt+F7或者选择项目属性,选择C/C++命令行,如下图所示:

在其他选项中输入:

/d1 reportAllClassLayout   (代表打印所有类的内存分布,你include的头文件里的类也会加入,会花费大量时间,不推荐使用)

/d1 reportSingleClassLayoutXXX  (XXX为你想查看的类名,注意类名不要和库中的类名重名或者是其他类名的子串,不然会打印多个类)

然后再cpp文件中写自己想要查的类,然后ctrl+B快速生成,在vs控制台即可查看。

 

2、普通类

class A_______ {
	int a;
	char ch;
};

3、含有虚函数的类

class A_______ {
	int a;
	char ch;
	virtual void vir_fun() {};
};

4、普通继承

class A_______ {
	int a;
	char ch;
//	virtual void vir_fun() {};
};
class B_______ :public A_______ {
	char ch;
	int b;
};

5、父类含有虚函数的继承

class A_______ {
	int a;
	char ch;
	virtual void vir_fun() {};
};
class B_______ :public A_______ {
	char ch;
	int b;
};

6、父类和子类都含有虚函数的继承

class A_______ {
	int a;
	char ch;
	virtual void v_funA() {};
};
class B_______ :public A_______ {
	char ch;
	int b;
	virtual void v_funB() {};
};

7、普通的多继承

class A_______ {
	int a;
	char ch;
};
class B_______ :public A_______ {
	char ch;
	int b;
};

class C_______ :public A_______ {
	char ch;
	int b;
};
 
class D_______ :public B_______,C_______ {
	char ch;
	int b;
};

8、父类含有虚函数的多继承

class A_______ {
	int a;
	char ch;
public:
	virtual void v_funA() {};
};
class B_______ :public A_______ {
	char ch;
	int b;
	void v_funA() {};
};

class C_______ :public A_______ {
	char ch;
	int b;
	void v_funA() {};
};
 
class D_______ :public B_______,C_______ {
	char ch;
	int b;
};

9、普通的虚多继承

class A_______ {
	int a;
	char ch;
public:
	//virtual void v_funA() {};
};
class B_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
};

class C_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
};
 
class D_______ :virtual public B_______,virtual public C_______ {
	char ch;
	int b;
};

 

 

10、父类含有虚函数的虚多继承

class A_______ {
	int a;
	char ch;
public:
	virtual void v_funA() {};
};
class B_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
};

class C_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
}; 
 
class D_______ : virtual public B_______, virtual public C_______{
	char ch;
	int b;
	void v_funA() {};
	virtual void f();
};

 

11、既有虚继承又有普通继承

class A_______ {
	int a;
	char ch;
public:
	virtual void v_funA() {};
};
class B_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
};

class C_______ :virtual public A_______ {
	char ch;
	int b;
	void v_funA() {};
}; 

class E_______ {
	int a;
	char ch;
public:
	virtual void v_funA() {};
};
 
class D_______ : virtual public B_______, virtual public C_______, public E_______ {
	char ch;
	int b;
	void v_funA() {};
	virtual void f();
};

12、简单总结

类成员构造顺序:非虚基类,自身,虚基类

虚函数表:只要子类普通继承了一个父类,如果父类中有虚函数,子类和父类会公用一张虚函数表,对于虚继承,父类和子类的虚表各自一张。

......

(博文有错误的地方希望多多指出)

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值