思考:
类之间是否存在直接的关联关系呢?

生活中的例子

  • 组合关系: 整体与部分的关系

clipboard.png

实例分析: 组合关系的描述

#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 << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};

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

int main()
{
    Computer c;

    return 0;
}
输出:
Memory()
Disk()
CPU()
MainBoard()
Computer()
~Computer()
~MainBoard()
~CPU()
~Disk()
~Memory()

类之间的组合关系

  • 组合关系的特点

    • 将其它类的对象最为当前类的成员使用
    • 当前类的对象与成员对象的生命期相同
    • 成员对象在用法上与普通对象完全一致

生活中的例子

  • 继承关系: 父子关系

clipboard.png

惊艳的继承

  • 面向对象中的继承指类之间的父子关系

    • 子类拥有父类的所有属性和行为
    • 子类是一种特殊的父类
    • 子类对象可以当作父类对象使用
    • 子类可以添加父类中没有的方法和属性

C++ 中通过下面的方式描述继承关系

class Parent
{
private:
    int mv;
public:
    void method() { }
};

class Child : public Parent  // 描述继承关系
{

};

编程实验: 继承初体验

#include <iostream>

using namespace std;

class Parent
{
public:
    Parent()
    {
        cout << "Parent()" << endl;
    }
    void method()
    {
        cout << "void method()" << endl;
    }
    ~Parent()
    {
        cout << "~Parent()" << endl;
    }
};

class Child : public Parent
{
public:
    Child()
    {
        cout << "Child()" << endl;
    }
    void hello()
    {
        cout << "I'm child class!" << endl;
    }
    ~Child()
    {
        cout << "~Child()" << endl;
    }
};

int main()
{
    Child c;
    
    c.hello();
    c.method();

    return 0;
}
输出:
Parent()
Child()
I'm child class!
void method()
~Child()
~Parent()

分析:
子类拥有父类所有的属性和行为;
在子类定义时,父类的构造函数先被调用,子类的构造函数再被调用,析构顺序相反。
  • 重要规则:

    • 子类就是一个特殊的父类
    • 子类对象可以直接初始化父类对象
    • 子类对象可以直接赋值给父类对象
void code()
{
    Child c;

    Parent p1 = c;
    Parent P2;
    
    p2 = c;
}

继承的意义

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

编程实验: 继承的强化练习

#include <iostream>
#include <string>

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 << "MainBoard()" << endl;
    }
    ~MainBoard()
    {
        cout << "~MainBoard()" << endl;
    }
};

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

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

class MacBook : public Computer
{
public:
    void OS()
    {
        cout << "Mac OS" << endl;
    }
};    

int main()
{
    HPBook hp;
    
    hp.power();
    hp.install("Ubuntu 16.04 LTS");
    hp.OS();
    
    cout << endl;
    
    MacBook mac;
    
    mac.OS();

    return 0;
}
输出:
Memory()
Disk()
CPU()
MainBoard()
Computer()
void power()
Ubuntu 16.04 LTS

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

小结

  • 继承是面向对象中类之间的一种关系
  • 子类拥有父类的所有属性和行为
  • 子类对象可以当作父类对象使用
  • 子类可以添加父类没有的方法和属性
  • 继承是面向对象中代码复用的重要手段

补充:
组合与继承是面向对象理论中的两种基本关系。其中组合关系较为简单,在实际项目中,优先考虑组合关系是否满足需求。

以上内容参考狄泰软件学院系列课程,请大家保护原创!


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧