基类
继承过程将创建一个新的派生类,它由基类的成员加上派生类添加的任何新成员组成。在多重继承中,可以构建一个继承关系图,其中相同的基类是多个派生类的一部分。下图显示了此类关系图。
单个基类的多个实例
在该图中,显示了 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++ 提供了一种优化这种基类的工作方式的方法。虚拟基类提供了一种节省空间和避免使用多重继承的类层次结构中出现多义性的方法。











