常见问题 Q1. 当类B从类A继承而来,而类A的析构函数不是虚函数,会发生什么? Q2. MFC类库中,CObject类的重要性不言自明。在CObject的定义中,我们看到一个有趣的现象,即COject的析构函数是虚拟的。为什么MFC的编写者认为虚拟的析构函数是必要的? Q3. 析构函数可以为vir ...
分类:
编程语言 时间:
2016-08-12 01:05:50
阅读次数:
131
本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料,如:http://blog.csdn.net/sanfengshou/article/details/4574604 说明:由于条件限制,仅测试了Windows平台下的VS2013 IDE。其余平 ...
分类:
编程语言 时间:
2016-08-08 06:27:03
阅读次数:
269
(来源于:http://blog.chinaunix.net/uid-25132162-id-1564955.html) 1、空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class B ...
分类:
其他好文 时间:
2016-08-07 23:05:39
阅读次数:
254
C++对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。对于各种支持的底层实现机制。 单继承(父类含虚函数) 输出:基类指针p在运行时发生动态绑定,fun2调用子类方法,fun1由于没有virtual,仍然调用父类方法 内存模型: 指针的虚表指向子类方法地址 当一个 ...
分类:
编程语言 时间:
2016-08-06 17:26:02
阅读次数:
189
在MFC编程中遇到了两种虚函数的特性,看如下代码,B继承于A,C继承于B,D继承于C,E继承于D,F继承于E。 第一种特性: 主函数中创建类C的对象,用ptr指针来指向这个对象,1:然后调用虚函数vFunc(), 运行结果为vFuncC,分析原因:即使D、E、F类都继承了C类且互相继承,但是调用虚函 ...
分类:
其他好文 时间:
2016-08-06 00:18:41
阅读次数:
149
本篇笔记主要分为两个主要部分,第一部分关于对象模型,第二部分是关于new和delete的更加深入的学习。 对象模型 关于vptr(虚指针)和vtbl(虚函数表) 只要用到了虚函数,对象中就会多一个指向虚函数表的虚指针。在32位环境下,将占4Bytes的空间。 在vtbl中,每一项都是指向自己类应当调 ...
分类:
编程语言 时间:
2016-08-05 17:26:31
阅读次数:
239
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 class Cman { public: ...
分类:
编程语言 时间:
2016-08-04 21:38:15
阅读次数:
236
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个死循环。 可是析构函数却要定义成虚函数,这是为什么呢,写一个非常简单的例子来理解一下: 输出结果: ...
分类:
编程语言 时间:
2016-08-03 18:18:58
阅读次数:
145
这段代码是是以前virtual以前没认识到的地方,间接用指针或者引用调用虚函数还是动态绑定。 对动态绑定认识不够深刻啊, 指针|引用&virtual。 条款35:考虑virtual函数的其他选择 例子,游戏角色健康指数 温习: 1、使用no virtual interface(NVI)手法,那是te ...
分类:
编程语言 时间:
2016-08-02 13:02:56
阅读次数:
211
函数重载只会发生在同一个类中,函数名相同,只能通过参数类型,参数个数或者有无const来区分。不能通过返回值类型区分,而且virtual也是可有可无的,即虚函数和普通函数在同一类中也可以构成函数重载。基类和派生类中只能是隐藏或者覆盖。1)隐藏是指派生类中有函数与基类中函数同名,但是没有构成虚函数覆盖 ...
分类:
其他好文 时间:
2016-08-01 22:30:01
阅读次数:
143