zoukankan      html  css  js  c++  java
  • 第43课 继承的概念和意义

    类之间的组合关系

    生活中的一个简单例子:

    电脑是由CPU、内存、硬盘、主板等组成。电脑缺少它们其中的任一部分都无法正确运行,它们同生死。下面用程序进行描述:

    #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
    {
        Memory mMem;
        Disk mDisk;
        CPU mCPU;
        MainBoard mMainBoard;
    public:
        Computer()
        {
            cout << "Computer()" << endl;
        }
        void power()
        {
            cout << "power()" << endl;
        }
        void reset()
        {
            cout << "reset()" << endl;
        }
        ~Computer()
        {
            cout << "~Computer()" << endl;
        }
    };
    
    int main()
    {
        Computer c;
    
        return 0;
    }

    组合关系的特点
    -将其它类的对象作为当前类的成员使用
    -当前类的对象成员对象的生命周期相同
    -成员对象在用法上与普通对象完全一致

    在实际的工程开发中,首先考虑组合关系,看一下组合关系能否解决,如果不能解决,再考虑继承。

    惊艳的继承
    面向对象中的继承指类之间的父子关系
    -子类拥有父类的所有属性和行为
    -子类就是一种特殊的父类
    -子类对象可以当作父类对象使用
    -子类中可以添加父类没有的方法和属性

    C++中通过下面的方式描述继承关系
    class Parent
    {
      int mv;
    public:
      void method()
      {};
    };

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

    };

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Parent
    {
        int mv;
    public:
        Parent()
        {
            cout << "Parent()" << endl;
            mv = 100;
        }
        void method()
        {
            cout << "mv = " << mv << endl;
        }
    };
    
    class Child : public Parent
    {
    public:
        void hello()
        {
            cout << "I'm Child calss!" << endl;
        }
    };
    
    int main()
    {   
        Child c;
        
        c.hello();
        c.method();
        
        return 0;
    }

    重要规则:
    -子类就是一个特殊的父类(因为它拥有了父类的一切属性和方法,只所以特殊是因为它可能添加自己的属性和方法)
    -子类对象可以直接初始化父类对象
    -子类对象可以直接赋值给父类对象

    #include <iostream>
    
    using namespace std;
    
    class Parent
    {
     private:
          int mv;
     public:
          Parent()
          {
              mv = 100;
          }
          void method()
          {
              cout << "mv = " << mv <<endl;
          }
    
    };
    
    class Child : public Parent
    {
    
    public:
        void hello()
        {
            cout << "I am child class" << endl;
        }
    };
    int main()
    {
        Child c;
        Parent p1 = c; //如果不是因为继承,这样的写法是编译不过的。因为这是两个不同的类。类型不一致,不能直接用来初始化和赋值。
        Parent p2;    //如何理解不同的对象竟然能初始化和赋值呢?因为一个子类对象就是一个特殊的父类,
        c.hello();
        c.method();
        p2 = c;
        return 0;
    }

    继承是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
    {
        Memory mMem;
        Disk mDisk;
        CPU mCPU;
        MainBoard mMainBoard;
    public:
        Computer()
        {
            cout << "Computer()" << endl;
        }
        void power()
        {
            cout << "power()" << endl;
        }
        void reset()
        {
            cout << "reset()" << endl;
        }
        ~Computer()
        {
            cout << "~Computer()" << endl;
        }
    };
    class HPbook : public Computer
    {
    private:
        string mOS;
    public:
        HPbook()
        {
            mOS = "Windows8";
        }
        void install (string os)
        {
            mOS = os;
        }
        void Os()
        {
            cout << mOS << endl;
        }
    };
    class Macbook : public Computer
    {
    
    };
    int main()
    {
        //Computer c;
        HPbook hp;
        hp.power();
        hp.install("Ubuntu 16.04 LTS");
        hp.Os();
    
        return 0;
    }

    小结:

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

  • 相关阅读:
    Visual Studio 2010使用Visual Assist X的方法
    SQL Server 2000 评估版 升级到 SQL Server 2000 零售版
    双网卡多网络单主机同时访问
    开发即过程!立此纪念一个IT新名词的诞生
    delphi dxBarManager1 目录遍历 转为RzCheckTree2树
    5320 软件集合
    delphi tree 从一个表复制到另一个表
    DELPHI 排课系统课表
    长沙金思维 出现在GOOGLE的 金思维 相关搜索里啦!!
    如何在DBGrid的每一行前加一个单选框?
  • 原文地址:https://www.cnblogs.com/-glb/p/11945323.html
Copyright © 2011-2022 走看看