C++浅析——继承类内存分布和虚析构函数
继承类研究
1.1 Cbase, CTEST为基类,CTest2为其继承类,并重新申明了基类中的同名变量
class CBase
{
public:
int Data; CBase();
~CBase();
}; class CTEST
{
//Data:
private:
int PrivateData1;
int PrivateData2;
public:
int Data; //Method:
public:
CTEST();
~CTEST();
void PrintData();
}; class CTest2 : public CBase, public CTEST
{
public:
int Data; CTest2();
~CTest2(); void PrintData2(); private:
int PrivateData1;
int PrivateData2;
};
CTest2* poCTest2 = new CTest2;
printf("CTest size = %d, CTest2 size = %d\n", sizeof(CTEST), sizeof(CTest2));
CTEST* poCTest = poCTest2;
delete poCTest;
2、 运行结果
3、 继承类的大小
尽管继承类中重新定义了和基类中同名的成员变量,但他们并不是同一份数据,而是继承类中包含了基类的全部数据,所以继承类的大小是自身大小加上所有父类的大小,通过VS调试跟踪也可以清楚的看到这一点。
4、 如果父类的析构函数不声明为Virtrual的后果
从运行结果上来看,只打印出了Ctest基类的析构函数输出,Cbase基类和继承类的析构函数都未被调用,如果CBase基类或继承类在析构函数中干了其他事情,那就永远不会执行了。同时由于poCTest的指针和poCTest2的指针不是同一个,导致delete的时候不正确(因为new的时候系统记录的是poCTest2的指针和大小,并未记录poCTest的指针)
5、 如果一个类可能会被继承,则一定要将其析构函数申明为虚函数
将父类申明为虚析构函数后,基类的析构函数就动态绑定为继承类的析构函数了,继承类析构时就会调用父类的析构函数,从而使基类全部正确析构。
C++浅析——继承类内存分布和虚析构函数的更多相关文章
- c++内存分布之虚析构函数
关于 本文代码演示环境: VS2017+32程序 虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数.看看实际结果. Note,一个类中,虚析构函数只能有一个. 本文 ...
- 记录:C++类内存分布(虚继承与虚函数)
工具:VS2013 先说一下VS环境下查看类内存分布的方法: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存 ...
- C++ 继承之虚继承与普通继承的内存分布
仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { ]; //加入一个变量是为了看清楚 ...
- c++内存分布之虚函数(多继承)
系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
- c++内存分布之虚函数(单一继承)
系列 c++内存分布之虚函数(单一继承) [本文] c++内存分布之虚函数(多继承) 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
- 【转】C++类-内存分布
C++类内存分布 - 转载自Jerry19880126 - 博客园 的文章 在上面这篇文章的基础上做了些整理. 主要讨论了C++类对象的内存分布结构. 来看看编译器是怎么处理类成员内存分布的,特别是在 ...
- 【C++ Primer | 15】C++类内存分布
C++类内存分布 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承.虚函数存在的情况下. 下面可以定义一个类,像下面这样: c ...
- 【转】C++类内存分布
C++类内存分布 https://www.cnblogs.com/jerry19880126/p/3616999.html 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看 ...
- c/c++: c++继承 内存分布 虚表 虚指针 (转)
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { pu ...
随机推荐
- ABAP--在查询条件只包含部分索引字段时,如何使用索引
One of the most important considerations when writing a select statement against a large table is th ...
- GDAL关于读写图像的简明总结
读写影像可以说是图像处理最基础的一步.关于使用GDAL读写影像,平时也在网上查了很多资料,就想结合自己的使用心得,做做简单的总结. 在这里写一个例子:裁剪lena图像的某部分内容,将其放入到新创建的. ...
- 超人学院二期学员分享hadoop工作经验
定于2月17日--2月23日的某一天,邀请咱们学员分享一下hadoop工作经验.对于没工作过的同学或者没从事过hadoop工作的同学,抓住机会啊,你可以提前准备自己关心的各种问题! 具体时间请关注QQ ...
- [Android]下拉刷新控件RefreshableView的实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4172483.html 需求:自定义一个ViewGroup,实现 ...
- 是否要学SpringMVC
如题,希望大侠们指出,不能用Spring就觉得他什么都好,本帖子意在实际工作中,对是否将Spring引入项目及如何更好的使用Spring提出启发式意见.目前已有高人表达了自己对Spring的不满,让我 ...
- Android时区及语言代码
1. 设置默认时区 PRODUCT_PROPERTY_OVERRIDES += \ persist.sys.timezone=Asia/Shanghai\ 注:搜索“persist ...
- android 最简单的自定义圆点view
首先创建一个选择器,用来判断圆点状态,可以根本自己的需求改 <selector xmlns:android="http://schemas.android.com/apk/res/an ...
- 访客至上的Web、移动可用性设计--指导原则
文章出自:听云博客 关于可用性设计,之前写过一个“纸上谈兵”版本的,那篇帖子主要是根据A/B test的方式来进行的. 但是最近找了本Steve krug写的Don't make me think,我 ...
- iOS 学习 - 15.添加水印
绘制到位图 下面利用位图图形上下文给一个图片添加水印,在下面的程序中我们首先创建上下文,然后在上下文中绘制图片.直线和文本,最后从当前位图上下文中取得最终形成的新图片显示到界面 - (void)vie ...
- CommonJS的模块规范
CommonJS对模块的定义十分简单,主要分为模块引用.模块定义和模块标识. 1.模块引用 var math = require('math');//这个方法接受模块标识,以此引入一个模块的API到当 ...