派生类的基类

如题所述

如前面讨论的,继承过程创建的新的派生类是由基类的成员加上由派生类新加的成员组成。在多重继承中,可以构造层次图,其中同一基类可以是多个派生类的一部分。图9.4显示了这种图。
多重基类
如同多重继承中所描述的,一个类可以从多个基类中派生出来。在派生类由多个基类派生出来的多重继承模式中,基类是用基类表语法成份来说明的。
class CollectionOfBook:public Book,public Collection
{
//新成员
};
基类的说明顺序一般没有重要的意义,除非在某些情况下要调用构造函数和析构函数的时候。在这些情况下,基类的说明顺序会对下面所列的有影响。
由构造函数引起的初始化发生的顺序。如果你的代码依赖于CollectionOfBook的Book部分要在Collection部分之前初始化,则此说明顺序将很重要。初始化是按基类表中的说明顺序进行初始化的。
激活析构函数以作清除工作的顺序。同样,当类的其它部分正在被清除时,如果某些特别部分要保留,则该顺序也很重要。析构函数的调用是按基类表说明顺序的反向进行调用的。
注意:基类的说明顺序会影响类的存储器分布。不要对基类成员在存储器中的顺序作出任何编程的决定。
在你说明基类表时,不能把同一类名称说明多次。但是对于一个派生类而言,其非直接基类可以有多个相同的。
虚拟基类
因为一个类可以多次作为一个派生类的非直接基类。C++提供了一个办法去优化这种基类的工作。
注意,在LunchCashierQueue对象中,有两个Queue子对象。下面的代码说明Queue为虚拟基类:
class Queue
{
//成员表
};
class CashierQueue:virtual public Queue
{
//成员表
};
class LunchQueue: virtual public Queue
{
//成员表
};
class LunchCashierQueue:public LunchQueue,public CashierQueue
{
//成员表
};
一个类对于给定的类型既可以有虚拟的组成部分,也可以有非虚拟的组成部分。
如果一个派生类重载了一个从虚拟基类中继承的虚拟函数,而且该派生类以指向虚拟基类的指针调用这些构造函数和析构函数时,编译器会引入一个附加的隐含的“vtordisp”域到带有虚拟基类的类中。/vd0编译器选项禁止了这个增加的隐含vtordisp构造/析构位置成员。/vd1选项(缺省),使得在需要时可以解除禁止。只有在你确信所有类的构造函数或析构函数都虚拟地调用了虚拟函数,vtordisp才可以关掉。
/vd编译器选项会影响全局编译模式。使用vtordisp编译指示可以在基于类方式上打开或禁止vtordisp域:
#pragma vtordisp(off)
class GetReal:virtual public{...};
#pragma vtordisp(on)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-14

本视频主要从Java语言基础、JavaSE核心、WEB全栈及数据库、Servlet/Jsp核心、 Java框架五个阶段进行讲解。在本教程中,会让大家从零基础快速掌握Java知识。想要配套学习资料的小伙伴可以联系我哦!

相似回答