zoukankan      html  css  js  c++  java
  • 基类派生类

    看了c#的教程,也上网络上搜索基类与派生类的概念,一直没有一个很明确的定义.弄得偶一直很迷糊,现在搜索到c++的教程里倒是有比较明确的说明,特意贴在这里,帮助自己理解.

    继承机制提供了无限重复利用程序资源的一种途径。
      继承使得我们得以用一种简单的方式来定义新类。如果我们定义了一个哺乳动物类包括哺乳动物的一些普通属性和方法,然后再定义一个狗类, 有没有必要重头开始定义呢?
    实际上这是没有必要的,因为狗是哺乳动物的一种特殊动物,定义狗类可以沿用哺乳动物类的所需的属性和方法,只需加上狗的颜色属性和狗尾巴会摇方法即可。
    继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。 
    我们称从已定义类产生新类的过程称为派生。已存在的用来派生新类的类为基类,又称父类。由已存在的类派生出的新类称为派生类,又称为子类。如上例,从哺乳动物派生出狗,哺乳动物是父类,狗是子类。

    在C++语言中, 一个派生类可以从一个基类派生,也可以从多个基类派生。
    从一个基类派生的继承称为单继承(如动画6-1);
    从多个基类派生的继承称为多继承(如动画6-2),
    由两个基类一个风扇类和一个台灯类派生出一个风扇台灯类。
    继承的处理从定义基类开始,基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法。
    继承重用父类的代码,专注于为子类编写代码。

    一.派生类的定义格式
    1. 单继承的定义格式:
    class <派生类名>:<继承方式><基类名>

    <派生类新定义成员>
    };

    解释:
    (1) <基类名>是已定义类的名称。 <派生类名>是新定义的一个类的名字,它是从<基类名>中派生的。
    (2) 派生类按指定的<继承方式>从基类中派生的,<继承方式>有常用的如下三种:
    public 表示公有继承
    private 表示私有继承
    protected 表示保护继承
    2 多继承的定义格式
    class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
    {
    <派生类新定义的成员>

    多继承与单继承的主要区别从定义格式上看,主要是多继承的基类多于一个。
    3 .例:单继承定义,
    如已定义了基类:Mammal类,如何定义一个派生类:Dog类。
    class Mammal{ //定义一个基类 
    protected: 
    int itsAge;
    int itsWeight;
    public: int GetAge(){return itsAge;}
    void SetAge(int age){itsAge=age;}
    int GetWeight(){return itsWeight;}
    void SetWeight(int itsWeight;)
    };
    class Dog:public Mammal{ //定义一个派生类
    private:
    char itsColor[10];
    public:
    char GetColor{return itsColor;}
    void SetColor(char *color){strcpy(itscolor,color);}
    void WagTail(){cout << " 尾巴摇摇…/n";}
    };

    多继承定义,如已定义两个基类:Fan类和一个Lamp类,如何定义一个派生类:FanLamp类。
    Class Fan{ //定义基类Fan
    int flag,power;
    public:
    void on(){flag=1;cout <<"打开风扇/n";}
    void off(){flag=0;cout <<"关闭风扇/n";}
    };
    class Lamp{ //定义基类Lamp
    int flag,power;
    public: 
    void on() {flag=1;cout <<"开灯/n";}
    void off() {flag=0;cout <<"关灯/n";}
    };
    //定义派生类FanLamp
    class FanLamp:public Fan,public Lamp
    {
    float price;
    };

    动画6_1
    二. 派生类的三种继承方式 表6-1表示三种继承方式的各自特点。

     

    公有继承、私有继承和保护继承是常用的三种继承法方式

    1. 对于公有继承方式 基类成员对其对象的可见性 公有成员可见,其他成员不可见
    基类成员对派生类的可见性 对派生类来说,基类的公有成员和保护成员可见
    基类成员对派生类对象的可见性 对派生类对象来说,基类的公有成员是可见的,其他成员是不可见
    2.对于私有继承方式 基类成员对其对象的可见性 公有成员可见,其他成员不可见
    基类成员对派生类的可见性 对派生类来说,基类的公有成员和保护成员是可见的
    基类成员对派生类对象的可见性 对派生类对象来说,基类的所有成员都是不可见的


    第一种继承方式程序段如下: 

    定义基类A:       
                   class A
                   
                   { int x;
                   
                   protected:
                   
                   int y; 
                   
                   public:
                   
                   A();
                   
                   ~A();
                   
                   friend void cal();
                   
                   void display();
                   
                   };
                   
                   定义继承类B:
                   
                   class B:public A
                   
                   {
                   
                   int z;
                   
                   public: 
                   
                   B();
                   
                   void fun(); 
                   
                   };
    定义继承类C:
    class c:private B{ int t; public: c(); ~c(); };


    三.基类和派生类关系 
    任何一个类都有可以派生出上个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。一个基类可以是另一个基类的派生类,这样便形成了复杂的继承结构,出现了类的层次。一个基类派生出一个派生类,它又做另一个派生类的基类,则原来基类为该派生类的间接基类。

    基类与派生类之间的关系可以有如下几种描述:

    1 派生类是基类的具体化
    类的层次通常反映了客观世界中某种真实的模型。例如,定义输入设备为基类,而键盘、鼠标器和数字化板将是派生类,它们关系如图6-3所示,在这种情况下,不难看出:基类是对若于个派生类的抽象,而派生类是基类的具体化。基类抽取了它的派生类的公共牲,而派生类通过增加行为将抽象类变为某种有用的类型。

    2 派生类是基类定义的延续
    先定义一个抽象基类,该基类中有些操作并未实现。然后定义非抽象的派生类,实现抽象基类中定义的操作。例如,虚函数就属此类情况。这时,派生类是抽象的基类的实现,即可看成是基类定义的延续。这也是派生类的一种常用的方法。

    3 派生类是基类的组合
    在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。如上述派生类风扇台灯类就是基类风扇类和台灯类的组合。

    例题6-1
    下面定义了一个关于交通工具的类
     class vehicle
     {
      int wheels; //轮子数
      float weight; //重量
      public:
      void initialize(int in_wheels, float in_weight);
      int get_wheels( ) {return wheels;}
      float get_weight( ) {return weight;}
      float wheel_loading( ) {return weight/wheels;}
     };
      如果要再定义一个小轿车的类和一个卡车的类,如何实现呢?这里我们就要用到面向对象程序设计的另一个机制--继承。现实世界的物质多种多样,但许多物质都存在着层次关系,这种层次结构是我们找到了描述事物的解决方法。
    下面通过继承来派生出小汽车和卡车的类。
     //小汽车的类
     class car : public vehicle
     {
      int passenger_load; //载客数
      public:
      void initialize(int in_wheels, float in_weight, int people = 4);
      int passengers( ) {return passenger_load;}
     };
     //卡车的类
     class truck : public vehicle 
     {
      int passenger_load; //载客数
      float payload; //有效负载
      public:
      void init_truck(int how_many = 2, float max_load = 24000.0);
      float efficiency( ); //马力
      int passengers( ) {return passenger_load;}
     };
      说明:上面通过继承从类vehicle中派生出了car和truck两个类。我们把vehicle称为基类,把car和truck称为派生类或子类 

  • 相关阅读:
    std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(5)
    std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(4)
    C++多线程库的常用函数 std::lock()
    std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(3)
    std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(2)
    std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(1)
    C++多线程库的常用模板类 std::lock_guard
    C++多线程库的常用类 std::mutex
    npm install 时,下载github的包超时解决方法
    SAP 电商云 Spartacus UI 和路由相关的 State 处理
  • 原文地址:https://www.cnblogs.com/xzh1993/p/6834492.html
Copyright © 2011-2022 走看看