12.2 多重继承(1)
12.1节讲解了类与类之间的关系,但所接触的派生类都只有一个父类。当子类拥有多个父类(如类C继承自类A同时也继承自类B)时,便构成了多重继承关系。在多重继承的情况下,子类所继承的父类变为多个,但其结构与单一继承相似。
分析多重继承的第一步是了解派生类中各数据成员在内存中的布局情况。在12.1节中,子类继承自一个父类,其内存中首先存放的是父类的数据成员。当子类产生多重继承时,其父类数据成员在内存中又该如何存放呢?我们通过代码清单12-8来看看多重继承类的定义。
代码清单12-8 多重继承类的定义—C++(www.cppentry.com)源码
- // 定义沙发类
- class CSofa{
- public:
- CSofa(){
- m_nColor = 2;
- }
- virtual ~CSofa(){ // 沙发类虚析构函数
- printf("virtual ~CSofa()\r\n");
- }
- virtual int GetColor(){ // 获取沙发颜色
- return m_nColor;
- }
- virtual int SitDown(){ // 沙发可以坐下休息
- return printf("Sit down and rest your legs\r\n");
- }
- protected:
- int m_nColor; // 沙发类成员变量
- };
-
- // 定义床类
- class CBed {
- public:
- CBed(){
- m_nLength = 4;
- m_nWidth = 5;
- }
- virtual ~CBed(){ // 床类虚析构函数
- printf("virtual ~CBed()\r\n");
- }
- virtual int GetArea(){ // 获取床面积
- return m_nLength * m_nWidth;
- }
- virtual int Sleep(){ // 床可以用来睡觉
- return printf("go to sleep\r\n");
- }
- protected:
- int m_nLength; // 床类成员变量
- int m_nWidth;
- };
-
- // 子类沙发床定义,派生自CSofa类和CBed类
- class CSofaBed : public CSofa, public CBed{
- public:
- CSofaBed(){
- m_nHeight = 6;
- }
- virtual ~CSofaBed(){ // 沙发床类的虚析构函数
- printf("virtual ~CSofaBed()\r\n");
- }
- virtual int SitDown(){ // 沙发可以坐下休息
- return printf("Sit down on the sofa bed\r\n");
- }
- virtual int Sleep(){ // 床可以用来睡觉
- return printf("go to sleep on the sofa bed\r\n");
- }
- virtual int GetHeight(){
- return m_nHeight;
- }
- protected:
- int m_nHeight; // 沙发类的成员变量
- };
代码清单12-8中定义了两个父类:沙发类和床类,通过多重继承,以它们为父类派生出沙发类,它们都拥有各自的属性以及方法。main函数中定义了子类SofaBed的对象,其中包含两个父类的数据成员,此时SofaBed在内存中占多少字节呢?如图12-7所示为对象SofaBed占用内存空间的大小。
|
| 图12-7 对象SofaBed占用内存空间的大小 |