C++ 程序设计精要教程
华中科技大学
第 9 章 多继承与虚基类
9.1 多继承类
单继承是多继承的一种特例,多继承派生类具有更强的类型表达能力。
多继承派生类有多个基类或虚基类。
派生类继承所有基类的数据成员和成员函数。
派生类在继承基类时,不同的基类可以采用不同的派生控制。
基类之间的成员可能同名,基类与派生类的成员也可能同名。在出现同名
时,如面向对象的作用域不能解析,应该使用作用域运算符来指明所要访问
的类的成员。
第 9 章 多继承与虚基类
通过单继承模拟多继承
多继承机制是 C++ 语言所特有的 (Java 、 C# 、 SmallTalk 等没有 ) 。其他
面向对象语言需要描述多继承类的对象时,常常通过对象成员或委托代理
实现多继承。
委托代理在多数情况下能够满足需要,但当对象成员和基类类型相同或存
在共同的基类时,就可能对同一个物理对象重复进行初始化 ( 可能是危险
的和不需要的 ) 。
通常需要重新设计类,使派生类不包含重复的基类或对象成员。
第 9 章 多继承与虚基类
【例 9.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( );
};
第 9 章 多继承与虚基类
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 和 vScrollBar 分别初始化显示端口,则派生类 ScrollableWind 的对象就
会多次初始化显示端口,从而导致显示屏出现多次闪烁。