zoukankan      html  css  js  c++  java
  • C++继承基础总结

    1.继承的基本概念

    1.类与类之间的关系

    1. has-A,包含关系,用以描述一个类由多个“部件类”构成,实现has-A关系用类的成员属性表示,即一个类的成员属性是另一个已经定义好的类。
    2. use-A,一个类使用另一个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的方式来实现。
    3. is-A,即继承关系,关系具有传递性。

    2.继承的相关概念

      万事万物皆有继承这个现象,所谓的继承就是一个类继承了另一个类的属性和方法,这个新的类包含了上一个类的属性和方法,被称为子类或者派生类,被继承的类称为父类或者基类。

    3.继承的特点

    • 子类拥有父类的一些属性和方法(除了构造函数和析构函数)。
    • 子类可以拥有父类没有的属性和方法。
    • 子类是一种特殊的父类,可以用子类来代替父类。
    • 子类对象可以当做父类对象使用。

    2. 继承一共有3种继承方式,适用于不同的场景,依情况而定 。

    1.公有继承:访问权限最高;除派生类外,外部函数也可以直接访问(无论是成员变量还是成员函数)。

    这里写图片描述

    适用场景:需要被外界访问到时,设置为public。

    2. 保护继承:访问权限中等;该类内部函数、派生类都能访问,外部类、外部函数不能访问

    这里写图片描述

    适用场景:只能在当前类和子类中访问,设置为protected。

    3. 私有继承:访问权限最低;只能是该类内部函数互相调用,派生类、外部函数都不能访问。

    这里写图片描述

    适用场景:只能在当前类中访问设置为private。

    值的一提的是:

    (1)父类中的private成员依然存在于子类中,但是却无法访问到。不论以何种方式继承父类,子类都无法直接使用父类中的private成员。

    (2)用public形式,基类除了私有成员的其它所有都被原样的继承到派生类中;即在基类中是public的,在派生类中还是public的,在基类中是protected的,在派生类中还是protected的。

    (3)如果采用protected形式,则基类中除了私有成员的其它所有都被以protected的形式继承到派生类protected中。

    (4)如果采用private形式,则基类中除了私有成员的其它所有都被以private的形式继承到派生类private中。

    举例:

    #include<iostream>
    using namespace std;
    class person{
    public:
        person()
        {
            name = "父类初始化" ;
            ID =  "父类初始化";
            age = "父类初始化" ;
            cout << "父 类 构 造 函 数" << endl ;
        }
        ~person()
        {
            cout << " ~父 类 析 构 函 数" << endl ;
        }
        void eat()
        {
            name = "父类name" ;
            ID =  "父类ID";
            age = "父类age" ;
            cout << "父 类 成 员 函 数" << endl;
        }
        string ID ; // 公有数据成员
    private:
        string name ;    //私有数据
    protected:
        string age ;  //保护数据成员
    };
    
    class worker :public person    //公有继承
    {
        public:
        worker()
        {
            salary = "子类初始化 ";
            cout << "子 类 构 造 函 数" << endl ;
        }
        ~worker()
        {
            cout << " ~子 类 析 构 函 数" << endl ;
        }
        void work()
        {
            name = "子类name" ; //  子类都无法直接使用父类中的private成员
            ID = "子类ID";
            age = "子类age" ;
            salary = "子类salary" ;
            cout << "子 类 成 员 函 数 " << endl ;
        }
        void print()
        {
            cout << "age  == " << age <<  endl ;
            cout << "ID == " << ID << endl ;
            cout << "salary == "<< salary << endl ;
        }
    private:
        string salary ;
    };
    int main(void)
    {
        worker work1 ;
        work1.ID = "我在外界设置的ID" ;
        work1.age =  "我在外界设置的age";  //被继承到了子类的protected 中 
        work1.print();
        cout << "---------------------------------------------------" <<  endl ;
    
        work1.eat(); //调用父类的public成员函数
        work1.print();
        cout << "---------------------------------------------------" <<  endl ;
    
        work1.work() ;//调用子类的public成员函数
        work1.print();
        cout << "---------------------------------------------------" <<  endl ;
    }
    

    运行结果:从结果可以看出它是符合公有继承的规则的,其余继承的规则大家可以去自己试试看看。

    这里写图片描述

    稍作改动之后的到如下结果:

    这里写图片描述

    值得注意的是:当我们去实例化一个派生类的时候,它会先去实例化出一个基类,然后再实例化出派生类。如果父类还存在父类,则先调用父类的父类的构造函数,依次往上推理即可。

  • 相关阅读:
    CMU15-445 Project #2
    CMU15-445 Project #1 Buffer Pool
    挂分原因
    「杂谈」关于斜率优化维护凸包
    「题解」GYM 101620J Justified Jungle
    「题解」AGC 052 B Tree Edges XOR
    C++ MT19937 随机数 限制范围
    「题解」Codeforces 348C Subset Sums
    「学习笔记」联赛数论再学习
    「题解」洛谷 P4597 序列sequence
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335304.html
Copyright © 2011-2022 走看看