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 ...
随机推荐
- 把GAE程序通过SSH部署到 VPS
大部分在文档上都写了, 写这篇文章的目的是发现现在appcfg.py update xxxx的时候会打开浏览器访问google请求授权(后台内建了一个本地server, 端口是8090, 授权成功后会 ...
- jQuery Countdown Timer 倒计时效果
这个一款简单的 jQuery 倒计时插件,用于显示剩余的天数,小时,分钟和秒.倒计时功能是非常有用的一个小功能,可以告诉用户多久以后您的网站将会发布或者关闭进行维护,还可以用于举办活动的开始和停止的倒 ...
- js的一些坑,持续增加,学习js应该注意的问题
大家来补充 1.变量类型模糊,容易出现问题; var a='1',b=1; a==b; //true a===b; //false 2.全局变量与函数内部变量同名时,在函数内部声明变量,声明位置虽然在 ...
- 好推二维码如何通过应用宝微下载支持微信自动打开APP下载?
好推二维码 官网 http://www.hotapp.cn 1. 为什么使用应用宝微下载? APP下载二维码,通过微信扫描下载的时候,微信目前只支持应用宝微下载,才能在微信里直接打开下载,否则就需要在 ...
- UI键盘通知
#import "ViewController.h" @interface ViewController () @property (nonatomic,strong) UITex ...
- 【代码笔记】iOS-竖排文字
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- 【代码笔记】iOS-手机验证码
一,效果图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIVi ...
- 【代码笔记】iOS-利用图片序列创建动态图片效果
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- Spring的IOC逐层深入——依赖注入的两种实现类型
构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...
- Xshell与securecrt之间不同
现在比较受欢迎的终端模拟器软件当属xshell和securecrt了,现在就客观的分析一下两款软件,以便更好选择. 一.功能对比1.1Xshell功能 支持布局切换 可调整执行顺序 提供多标签功能 对 ...