12.4 菱形继承(1)
菱形继承是最复杂的对象结构,菱形结构会将单一继承与多重继承进行组合,如图12-12所示。
|
| 图12-12 菱形继承结构图 |
在图12-12中,类D属于多重继承中的子类,其父类为类B和类C,类B和类C拥有同一个父类A,如代码清单12-13所示。
代码清单12-13 菱形结构的类继承和派生—C++(www.cppentry.com)源码
- // 定义家具类,等同于类A
- class CFurniture{
- public:
- CFurniture(){
- m_nPrice = 0;
- }
- virtual ~CFurniture(){ // 家具类的虚析构函数
- printf("virtual ~CFurniture()\r\n");
- }
- virtual int GetPrice(){ // 获取家具价格
- return m_nPrice;
- };
- protected:
- int m_nPrice; // 家具类的成员变量
- };
-
- // 定义沙发类,继承自类CFurniture,等同于类B
- class CSofa : virtual public CFurniture{
- public:
- CSofa(){
- m_nPrice = 1;
- 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; // 沙发类成员变量
- };
-
- // 定义床类,继承自类CFurniture,等同于类C
- class CBed : virtual public CFurniture{
- public:
- CBed(){
- m_nPrice = 3;
- 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,等同于类D
- 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; // 沙发类的成员变量
- };
- void main(int argc, char* argv[]){
- CSofaBed SofaBed;
- }