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;
    }

    小结:

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

  • 相关阅读:
    userdel -删除使用者帐号及相关档案
    useradd -帐号建立或更新新使用者的资讯
    uptime
    uuid
    Web 在线文件管理器学习笔记与总结(7)重命名文件
    Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
    Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
    Java实现 LeetCode 114 二叉树展开为链表
    Java实现 LeetCode 114 二叉树展开为链表
    Java实现 LeetCode 114 二叉树展开为链表
  • 原文地址:https://www.cnblogs.com/-glb/p/11945323.html
Copyright © 2011-2022 走看看