1 组合关系

我们先看一下组合关系:整体与部分的关系

  • 将其他类的对象作为当前类的成员使用,在用法上与普通对象完全一致
  • 当前类的对象与成员对象的声明周期相同

组合关系就是整体与部分的关系,可以理解为电脑由硬盘,内存,CPU,主板组成,他们生命周期相同,其中一个坏了,电脑就不能工作了。

2 继承

继承指类之间的父子关系

  • 子类是一种特殊的父类,拥有父类的所有属性和行为
  • 子类对象可以当作父类对象使用
  • 子类中可以添加父类中没有的方法和属性
  • 子类对象可以直接初始化父类对象,可以直接赋值给父类对象

继承的意义:
继承是 C++ 中代码复用的重要手段,通过继承,可以获得父类的所有功能,并且可以在子类中重写已有的功能,或者添加新功能

下面通过一个具体的示例来说明组合与继承的关系。
编程实验:组合与继承

// 30-1.cpp
#include<iostream>
using namespace std;
class Memory
{
public:
    Memory()
    {
        cout << "Memory()" << endl;
    }
    ~Memory()
    {
        cout << "~Memory()" << endl;
    }
};
class Disk
{
public:
    Disk()
    {
        cout << "Disk()" << endl;
    }
    ~Disk()
    {
        cout << "~Disk()" << endl;
    }
};
class CPU
{
public:
    CPU()
    {
        cout << "CPU()" << endl;
    }
    ~CPU()
    {
        cout << "~CPU()" << endl;
    }
};
class MainBoard
{
public:
    MainBoard()
    {
        cout << "MainBroad()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBroad()" << endl;
    }
};

class Computer
{
public:
    Computer()
    {
        cout << "Computer()" << endl;
    }
    void power()
    {
        cout << "power()" << endl;
    }
    void reset()
    {
        cout << "reset()" << endl;
    }
    ~Computer()
    {
        cout << "~Computer()" << endl;
    }
private:
    Memory mMem;
    Disk mDisk;
    CPU mCPU;
    MainBoard mMainBroad;
};

class HPBook: public Computer
{
public:
    HPBook()
    {
        mOS = "Windows 10";
    }
    void install(string os)
    {
        mOS = os;
    }
    void OS()
    {
        cout << mOS << endl;
    }
private:
    string mOS;
};
class MacBook : public Computer
{
public:
    void OS()
    {
        cout << "Mac OS" << endl;
    }
};

int main()
{
    HPBook hp;
    hp.power();
    hp.install("Ubuntu 18.06");
    hp.OS();
    
    cout << endl;
    
    MacBook mac;
    mac.OS();
    return 0;
}
  • Memory,Disk mDisk,CPU mCPU 和 MainBoard 分别是四个类,这四个类的对象是类 Computer 的四个成员,这四个类和 Computer 是组合关系。
  • HPBook 和 MacBook 是一种具体的 Computer,Computer是父类,HPBook 和 MacBook 是子类
  • 子类拥有父类的所有属性和行为,也可以添加新的方法和属性,可以当作父类对象使用

编译运行:

$ g++ 30-1.cpp -o 30-1
$ ./30-1
Memory()
Disk()
CPU()
MainBroad()
Computer()
Power()
Ubuntu 18.06

Memory()
Disk()
CPU()
MainBroad()
Computer()
Mac OS
~Computer()
~MainBroad()
~CPU()
~Disk()
~Memory()
~Computer()
~MainBroad()
~CPU()
~Disk()
~Memory()

3 小结

1、组合是整体与局部的关系,继承是父子关系
1、子类拥有父类的所有属性和行为,子类可以添加父类中没有的属性个方法
2、子类对象可以当作父类对象使用