第8章多继承类 ■8.1多继承类 ■ 8.2虚基类 8.3派生类成员 ■8.4构造与析构 ■8.5类的存储空间 2
2 第8章 多继承类 8.1 多继承类 8.2 虚基类 8.3 派生类成员 8.4 构造与析构 8.5 类的存储空间
8.1多继承类 特点: ①多继承派生类有多个基类或虚基类。 ②派生类继承所有基类(包括间接基类)的数据成员和成员函数 ③ 派生类可以定义新的数据成员和函数成员,以便描述新类特 有的或不同的属性和功能 单继承是多继承的一种特例,多继承派生类具有更强的类型 表达能力。 多继承机制是C+语言所特有的(Java、SmallTalk没有) 。 因此,C++具有更强的描述对象方面的功能。其他面向对象 语言需要描述多继承类的对象时,常常通过对象成员或委托 代理实现多继承。委托代理在多数情况下能够满足需要,但 当对象成员和基类的类型相同或存在共同的基类时,就可能 对同一个物理对象重复进行初始化。【例8.1】 3
3 8.1 多继承类 特点: ① 多继承派生类有多个基类或虚基类。 ② 派生类继承所有基类(包括间接基类)的数据成员和成员函数 ③ 派生类可以定义新的数据成员和函数成员,以便描述新类特 有的或不同的属性和功能 ④ 单继承是多继承的一种特例,多继承派生类具有更强的类型 表达能力。 ⑤ 多继承机制是C++语言所特有的(Java、SmallTalk没有)。 因此,C++具有更强的描述对象方面的功能。其他面向对象 语言需要描述多继承类的对象时,常常通过对象成员或委托 代理实现多继承。委托代理在多数情况下能够满足需要,但 当对象成员和基类的类型相同或存在共同的基类时,就可能 对同一个物理对象重复进行初始化。【例8.1】
【例8.1】定义具有水平滚动条和垂直滚动条的窗口类。 class Window{ I. public: Window(int top,int left,int bottom,int right); Window(); 为 class HScrollbar . public: HScrollbar (int top,int left,int bottom,int right); ~HScrollbar () 街 class VScrollbar{ ∥ public: VScrollbar (int top,int left,int bottom,int right); ~VScrollbar(); 4
4 【例8.1】定义具有水平滚动条和垂直滚动条的窗口类。 定义具有水平滚动条和垂直滚动条的窗口类。 class Window{ //... public: Window(int top, int left, int bottom, int right); ~Window( ); }; class HScrollbar{ //... public: HScrollbar (int top, int left, int bottom, int right); ~ HScrollbar ( ); }; class VScrollbar{ //... public: VScrollbar (int top, int left, int bottom, int right); ~ VScrollbar( ); };
class Scrollable Wind:public Window HScrollbar hScrollBar;/委托hScrollBar代理水平滚动 VScrollbar vScrollBar;/委托vScrollBar代理垂直滚动 ∥. public: ScrollableWind(int top,int left,int bottom,int right); -Scrollable Wind(); 房 ScrollableWind:ScrollableWind (int t,int I,int b,int r):Window(t,L,b,r), hScrollbar(t,r+1,b-1,r),vScrollbar(b-1,1-1,b,r+1) 如果Vindow、hScrollBari和hScrollBar2分别初始化 显示端口,则派生类Scrollable Wind的对象就会多次 初始化显示端口,从而导致显示屏因多次初始化显示 端口出现多次闪烁。→使用虚基类定义Scrollable Wind 5
5 class ScrollableWind: public Window{ HScrollbar hScrollBar; //委托hScrollBar代理水平滚动 VScrollbar vScrollBar; //委托vScrollBar代理垂直滚动 //... public: ScrollableWind(int top, int left, int bottom, int right); ~ScrollableWind( ); }; ScrollableWind::ScrollableWind (int t, int l, int b, int r):Window(t, l, b, r), hScrollbar(t, r+1, b-1, r), vScrollbar(b-1,l-1,b,r+1) { //... } 如果Window 、hScrollBar 和hScrollBar分别初始化 显示端口,则派生类ScrollableWind的对象就会多次 初始化显示端口,从而导致显示屏因多次初始化显示 端口出现多次闪烁。 Æ使用虚基类定义ScrollableWind
用多继承方式定义派生类Scrollable Wind class Scrollable Wind:public Window,public HScrollbar,public VScrollbar{ l public: Scrollable Wind(int top,int left,int bottom,int right); -Scrollable Wind(); }; ScrollableWind:Scrollable Wind (int t,int I,int b,int r):Window(t,I,b,r), HScrollbar(t,r+1,b-1,r),VScrollbar(b-1,1-1,b,r+1) .. 1.多继承派生类的定义: class Derived::<派生方式>基类1,<派生方式>基类2,.{ <类体> public }; private protected 2.派生类对象多次初始化同一基类数据成员问题。 6
6 用多继承方式定义派生类 用多继承方式定义派生类ScrollableWind ScrollableWind class ScrollableWind:public Window,public HScrollbar,public VScrollbar{ //... public: ScrollableWind(int top, int left, int bottom, int right); ~ScrollableWind( ); }; ScrollableWind::ScrollableWind (int t, int l, int b, int r): Window(t, l, b, r), HScrollbar(t, r+1, b-1, r),VScrollbar(b-1,l-1,b,r+1) { //... } 1. 多继承派生类的定义: class Derived:<派生方式> 基类 1,<派生方式> 基类 2,…{ <类体 > }; 2. 派生类对象多次初始化同一基类数据成员问题。 public private protected