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 ...
随机推荐
- 开发中可能会用到的几个 jQuery 小提示和技巧
今天,我们将分享一些很有用的技巧和窍门给 jQuery 开发人员.jQuery 是最好的 JavaScript 库之一,用于简化动画,事件处理,支持 Ajax 和 HTML 的客户端脚本.网络中有大量 ...
- 使用 SVG 动画实现弹性的页面元素效果
Codrops 分享了一些给SVG元素加上弹性动画的灵感.实现的思路是把一个SVG元素整合成一个组件,然后从一个路径弹性动画到另一个.这种效果可以应用到像菜单,按钮或其它元素,使得交互更有趣,看起更原 ...
- 如何在SharePoint2010中创建自定义电子邮件警报处理程序
字段,如项目名称字段中,将被截断到的电子邮件通知中的 70 个字符.要解决 70 个字符的限制,请使用"更多信息"一节中的介绍的方法. 要嵌入电子邮件通知中的其他内容. 您想要更改 ...
- Hadoop 2.5.1集群安装配置
本文的安装只涉及了hadoop-common.hadoop-hdfs.hadoop-mapreduce和hadoop-yarn,并不包含HBase.Hive和Pig等. http://blog.csd ...
- 转-Nmap扫描原理与用法
1 Nmap介绍 操作系统与设备类型等信息. Nmap的优点: 1. 灵活.支持数十种不同的扫描方式,支持多种目标对象的扫描. 2. 强大.Nmap可以用于扫描互联网上大规 ...
- Android http 的使用
1.okHttp https://github.com/square/okhttp 2.okhttp-utils https://github.com/hongyangAndroid/ok ...
- Android java传递int类型数组给C
接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...
- Facebook开源动画库 POP-POPDecayAnimation运用
关于POPDecayAnimation的介绍先引用别人写的一些内容,基本上把它的一些注意点都说明了: Decay Animation 就是 POP 提供的另外一个非常特别的动画,他实现了一个衰减的效果 ...
- Android简单的ListViewDemo及每个控件的点击事件
ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...
- 【代码笔记】iOS-屏幕旋转
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. se ...