深入解析深入解析C++编程中基类与基类的继承的相关知识编程中基类与基类的继承的相关知识
主要介绍了C++编程中基类与基类的继承的相关知识,包括多个基类继承与虚拟基类等重要知识,需要的朋友可以
参考下
基类基类
继承过程将创建一个新的派生类,它由基类的成员加上派生类添加的任何新成员组成。在多重继承中,可以构建一个继承关系
图,其中相同的基类是多个派生类的一部分。下图显示了此类关系图。
单个基类的多个实例
在该图中,显示了 CollectibleString 和 CollectibleSortable 的组件的图形化表示形式。但是,基类 Collectible 位于通过
CollectibleSortableString 路径和 CollectibleString 路径的 CollectibleSortable 中。若要消除此冗余,可以在继承此类类时将其
声明为虚拟基类。
多个基类多个基类
如多重继承中所述,类可以从多个基类派生。在多重继承模型中(其中,类派生自多个基类),使用 base-list 语法元素指定
基类(请参阅概述中的“语法”一节)。例如,可以指定派生自 CollectionOfBook 和 Collection 的 Book 的类声明:
// deriv_MultipleBaseClasses.cpp
// compile with: /LD
class Collection {
};
class Book {};
class CollectionOfBook : public Book, public Collection {
// New members
};
指定基类的顺序并不重要,只不过在某些情况下,将调用构造函数和析构函数。在这些情况下,指定基类的顺序将影响:
构造函数进行初始化的顺序。如果您的代码依赖要在 Book 部分之前初始化的 CollectionOfBook 的 Collection 部分,则规范的
顺序很重要。按照 base-list 中指定类的顺序执行初始化。
调用析构函数以进行清理的顺序。同样,如果在销毁另一部分时必须呈现类的特定“部分”,则顺序非常重要。按照与 base-list
中指定类的顺序相反的顺序调用析构函数。
注意
基类的规范顺序会影响类的内存布局。不要基于内存中基成员的顺序做出任何编程决策。
当指定 base-list 时,不能多次指定同一类名。但是,可以将类多次作为派生类的间接基。
虚拟基类虚拟基类
由于一个类可能多次成为派生类的间接基类,因此 C++ 提供了一种优化这种基类的工作方式的方法。虚拟基类提供了一种节
省空间和避免使用多重继承的类层次结构中出现多义性的方法。
每个非虚拟对象包含在基类中定义的数据成员的一个副本。这种重复浪费了空间,并要求您在每次访问基类成员时都必须指定
所需的基类成员的副本。
当将某个基类指定为虚拟基时,该基类可以多次作为间接基而无需复制其数据成员。基类的数据成员的单个副本由将其用作虚
拟基的所有基类共享。
当声明虚拟基类时,virtual 关键字将显示在派生类的基列表中。
请考虑下图中的类层次结构,它演示了模拟的午餐排队。
模拟午餐排队图
在该图中,Queue 是 CashierQueue 和 LunchQueue 的基类。但是,当将这两个类组合成 LunchCashierQueue 时,会出现
以下问题:新类包含类型 Queue 的两个子对象,一个来自 CashierQueue,另一个来自 LunchQueue。下图显示了概念上的
内存布局(实际物理内存布局可能会进行优化)。