首页 > 技术文章 > C++继承基础总结

Tattoo-Welkin 2018-02-26 20:28 原文

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

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

这里写图片描述

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

这里写图片描述

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

推荐阅读