• 继承与派生


    继承(inheritance)与派生

    1、 定义:继承就是在一个已经存在的类的基础上建立一个新的类,已经存在的类称为基类(base class)或者父类(father class),新建的类称为派生类(derived class)或者子类(son class)。

    一个派生类之从一个基类派生,称为单继承(single inheritance);

    一个派生类有两个或者多个基类,称为多重继承(multiple inheritance);

    2、 派生类的声明方式

    class student

    {

       public:

    protected:

        int m_num;

        string m_name;

        char m_sex;

    };

    class stu:protected student

    {

    public:

        void get_value();

        void display();

    protected:

        int m_age;  

        string m_addr;

    };

    即:

    Class 派生类名:[继承方式] 基类名

    {

    派生类新增加的成员;

    };

    其中,继承方式包括public(共有的)、private(私有的)、protected(受保护的),继承方式是可选的,如果不写此项,则默认为私有的。

    3、 派生类的构成:从基类继承过来的成员(不包括构造函数和析构函数)和自己增加的成员。

    4、 基类成员在派生类中的访问属性

    在基类的访问属性

    继承方式

    在派生类中的访问属性

    private(私有)

    public(公用)

    不可访问

    private(私有)

    private(私有)

    不可访问

    private(私有)

    protected(保护)

    不可访问

    public(公用)

    public(公用)

    public(公用)

    public(公用)

    private(私有)

    private(私有)

    public(公用)

    protected(保护)

    protected(保护)

    protected(保护)

    public(公用)

    protected(保护)

    protected(保护)

    private(私有)

    private(私有)

    protected(保护)

    protected(保护)

    protected(保护)

    5、 派生类中的成员的访问属性

    派生类中访问属性

    在派生类中

    在派生类外

    在下一层公用派生类中

    公用

    可以

    可以

    可以

    保护

    可以

    不可以

    可以

    私有

    可以

    不可以

    不可以

    不可访问

    不可访问

    不可访问

    不可访问

    6、 派生类的构造函数

    用户在声明类时可以不定义构造函数,系统会自动设置一个默认的构造函数,在定义类对象时会自动的调用这个默认的构造函数,构造函数的主要作用就是对数据成员初始化。

    (1)      简单派生类的构造函数

    派生类构造函数名(总参数表):基类构造函数名(参数表) 

    {

    派生类中新增数据成员初始化语句;

    }

    class student

    {

    public:

        student(int m_Num,string m_Name,char m_Sex)//定义基类构造函数并赋值

        {

            m_Num=123;

            m_Name="zhangsan";

            m_Sex=f;

        }

        ~student();//定义基类的析构函数

    protected:

        int m_Num;

        string m_Name;

        char m_Sex;

       

    };

    class stu:protected student

    {

    public:

        stu(int m_Num,string m_Name,char m_Sex,int m_Age,string m_Addr):student(m_Num,m_Name,m_Sex)

          //注意,student(m_Num,m_Name,m_Sex)是调用基类的构造函数,因此这些参数是实参

        {

            m_Age=24;

            m_Addr="shandong";

        }

        ~stu();

        void get_value();

        void display();

    protected:

        int m_Age;  

        string m_Addr;

    };

    //也可以在类外定义派生类的构造函数

    class computer

    {

    public:

        computer(int m_Size,string m_Brands);//声明构造函数

        ~computer();

    };

    computer::computer(int m_Size, string m_Brands)//在类外定义构造函数

    {

        m_Size=15;

        m_Brands="LENOVO";

    }

    (2)     有子对象的派生类的构造函数

    派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表)

    {

    派生类中新增数据成员初始化语句;

    }

    执行派生类构造函数的顺序是:调用基类的构造函数,对基类数据成员初始化;调用子对象的构造函数,对子对象数据成员初始化;调用派生类的构造函数,对派生类数据成员初始化

    (3)     特殊形式

    A. 当不需要对派生类新增的成员进行任何初始操作时,派生类构造函数的函数体可以为空

    B. 如果在基类中没有定义构造函数,或定义了没有参数的构造函数,在定义派生类构造函数时可以不写基类的构造函数。

  • 相关阅读:
    使用接口测试活动的中奖概率(随机事件测试)
    关于测试用例冗余的一些思考
    正则表达式经典实例
    自动化测试断言Assent的使用
    equals与==区别
    Git的使用以及GitHub
    django的配置文件字符串是怎么导入的?
    支付宝支付相关开发
    Django的contenttypes
    推荐课程及用户登录
  • 原文地址:https://www.cnblogs.com/wangxiansendebaobaowu/p/8836030.html
Copyright © 2020-2023  润新知