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

    小结:

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

  • 相关阅读:
    BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
    [莫比乌斯反演]【学习笔记】[旧]
    BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
    BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
    Waiting for possible shutdown message on port 4445
    linux对文件赋权限的命令chmod的详细说明
    查看防火墙状态
    Jmeter分布式测试的各种坑之jmeter-server修改ip
    linux服务器查看公网IP信息的方法
    jmeter-server中启动后端口总是不断在变化
  • 原文地址:https://www.cnblogs.com/-glb/p/11945323.html
Copyright © 2020-2023  润新知