如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的炼狱。这个C++中最复杂的继承层次在VC上的实现其实我没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧。
分2个阶段来探讨:
1. 有虚函数的派生类虚继承了没有虚函数的基类;
2. 有虚函数的派生类虚继承了有虚...
分类:
编程语言 时间:
2016-06-24 15:45:50
阅读次数:
285
我们知道,虚继承的基类在类的层次结构中只可能出现一个实例。虚基类在类的层次结构中的位置是不能固定的,因为继承了虚基类的类可能会再次被其他类多继承。
比如class A: virtual T{} 这时T的位置如果相对于A是固定值的话,假设偏移是X,当再有个类 class B:virtual T{} ;这时假设在B里面T的偏移是固定的Y,而当再有一个类,class C: B, A {} 的时候...
分类:
编程语言 时间:
2016-06-21 07:45:52
阅读次数:
236
前提概念: 多重继承:比如类a继承类b,类b继承类c,这类关系称为多重继承 多继承:比如类a继承类b和类c,这类关系称为多继承 典型问题: 例如: 农民类和工人类继承自人类,农民工类继承自农民类和工人类。这种菱形的继承将为带来农民工类中将有两份人类中的成员,导致数据冗余。 解决方案——虚继承: 关键 ...
分类:
编程语言 时间:
2016-06-20 14:11:33
阅读次数:
173
关于虚基类表指针/虚函数表指针这些类里面的“隐藏成员”在结构里面是如何进行字节对齐的这个问题困惑了我48个小时。虽然网上也有很多关于虚继承、虚函数表、虚基类等内存布局的一些文章,但是基本上谈的都是大致的布局,什么地方有什么,按照什么顺序来排放等这些泛泛而谈的东西,好像都没有把字节对齐方面考虑进去的文章,或许他们都没有考虑到一些复杂层次的类继承关系,从而字节对齐的问题也没有成为问题,也自然而然地会被...
分类:
编程语言 时间:
2016-06-16 15:01:57
阅读次数:
304
多继承产生的问题 #include using namespace std;// 多继承产生的问题:如果一个继承的多继承有同一个父类,// 则父类的构造函数会被调用两次//////////////////////////////////////////////////////////////////... ...
分类:
其他好文 时间:
2016-06-14 08:51:55
阅读次数:
152
发现这个月准备竞赛完全没有更新哎。。。 改了下某华大一c++测试题。。。网上对虚继承讲的要么太繁琐要么不到位,自力更生 我们可以看出,通过虚继承方式的派生类并不调用基类的构造函数。 当我们注释掉B,C对A的virtual继承方式后,由于派生类不允许访问间非虚拟接继承的基础类,程序会报错。 然后我对程 ...
分类:
其他好文 时间:
2016-05-27 10:44:11
阅读次数:
176
多态的实现分为静态多态和动态多态,静态多态主要靠函数重载,动态多态主要靠虚函数 当类中声明了虚函数之后,该类的内存映像会获得一个虚表指针,叫做_vfptr指向该类的虚表,下面的我测试使用的类图(有的没必要的东西没有写) 这里恰好还是一个菱形继承,但是就像我之前说的虚继承和虚表关系不大,所以单继承也是 ...
分类:
其他好文 时间:
2016-05-22 10:50:14
阅读次数:
154
Item M24:理解虚拟函数、多继承、虚继承和RTTI所需的代价
C++编译器们必须实现语言的每一个特性。这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性。在多数情况下,你不用关心这些事情。然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要。这种特性中最重要的例子是...
分类:
编程语言 时间:
2016-05-07 10:10:48
阅读次数:
235
虚继承节省空间,解决二义性问题。虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如下图所示。类D继承自类B1、B2,而类B1、B2都继承自类A,因此出现如右图所示的局面(非虚基类)。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚..
分类:
其他好文 时间:
2016-04-26 22:23:12
阅读次数:
240
原文链接:吴秦大神的C++对象模型。 何为C++对象模型? 何为C++对象模型? C++对象模型可以概括为以下2部分: 1、语言中直接支持面向对象程序设计的部分; 2、对于各种支持的底层实现机制。 语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多 ...
分类:
编程语言 时间:
2016-04-24 12:32:24
阅读次数:
416