C++面向对象05【继承】

摘要:1.继承和派生
2.继承关系和复合关系
3.覆盖和保护成员(protected)
4.派生类的构造函数
5.public继承的赋值兼容规则
6.直接基类与间接基类

1.继承和派生
这种机制诞生的目的:提高软件的重用性(实现相同功能时,可将之前写过的代码直接拿来用,不用重写)

继承:在定义一个新的类B时,如果该类与某个已有的类A 相似(指的是B 拥有A的全部特点),那么就可以把A作为一个基类,把B 作为基类的一个派生类(子类)
派生类是通过对基类进行修改和扩充得到的
派生类一经定义后,可以独立使用,不依赖于基类
派生类拥有基类的全部成员函数和成员变量(无论成员的可访问范围是什么)

  • 在派生类的的各个成员函数中,不能访问基类中的private成员

格式:
class 派生类名:public 基类名
{
};

派生类对象的体积=基类对象体积+派生类对象自己的成员变量的体积
派生类对象中包含着基类对象
基类对象的储存位置位于派生类对象新增的成员变量之前

2.继承关系和复合关系

  • 继承:“是”关系
    B是基类A的派生类:逻辑上要求一个B对象也一个A对象
  • 复合:“有”关系
    类C中成员变量k,k是类D的对象,则C和D是复合关系
    逻辑上要求:D对象是C对象的固有属性组成部分
    例:圆类和点类应该用复合关系
    class CPoint
    {
    double x,y;
    }
  • 继承写法(不合适,因为圆不是一个点)
    class CCircle:public CPoint
    {
    double r;
    }
  • 复合写法(正确,每一个圆对象里都包含一个点对象,即为圆心)
    class CCircle
    {
    double r;
    CPoint center;
    };//但是要把圆类设置成点类的友元,否则无法访问点类中私有成员x,y

复合关系的正确使用
例:
狗与业主关系的正确写法:
为狗类设一个业主类的对象指针
为业主类设一个狗类的对象指针数组
class CMaster;
class CDog{
CMaster 星 pm;
};
class CMaster{
CDog * dogs[10];
};

3.覆盖和保护成员
覆盖:派生类可以定义一个和基类成员同名的成员
在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员
要在派生类中访问由基类定义的同名成员时,要使用作用域符号::

保护成员的存取权限说明符:protected
基类的protected成员可被下列函数访问:

  • 基类的成员函数
  • 基类的友元函数//前两个和基类的private成员一样
  • 派生类的成员函数可以访问当前对象的基类的保护成员
    例:
    class Father{
    protected:int n;};
    class Son:public Father{
    void Access(){
    n=1;//访问从基类继承的保护成员,可以
    Son f;
    f.n=1;//编译报错,f不是当前对象
    };
    int main()
    {Father f;
    Son s;
    f.n=1;//错误
    s.n=1;//错误
    return 0;
    }

4.派生类的构造函数
问题:派生类对象如何初始化基类对象的私有成员变量?
回答:在派生类构造函数的初始化列表里调用基类的构造函数对派生类对象所包含的基类对象初始化

在创建派生类对象时,需要调用基类的构造函数:初始化派生类对象从基类继承的成员
在执行一个派生类的构造函数之前,总是执行基类的构造函数

调用基类构造函数的两种方式
-显示方式:在派生类的构造函数中,在初始化列表里为基类的构造函数提供参数
derived::derived(arg_derived-list):base(arg_base-list)

  • 隐式方式:在派生类的构造函数中,省略基类的构造函数时,派生类的构造函数自动调用基类的默认无参构造函数(如果基类没有则报错)

派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数

包含成员对象的派生类的构造函数,基类和成员对象的初始化都需要在初始化列表里交待

  • 先执行基类的构造函数,初始化派生类对象中从基类继承的成员
  • 再执行成员对象类的构造函数
  • 最后执行派生类自己的构造函数
    派生类对象消亡时,析构函数调用顺序与构造函数调用顺序相反

5.public继承的赋值兼容规则

  • 派生类对象可以赋值给基类对象 b=d;
  • 派生类对象可以初始化基类引用 base & br=d;
  • 派生类对象的地址可以赋值给基类指针 base * pb=&d;

6.直接基类与间接基类
在声明派生类时,只需要列出它的直接基类
派生类沿着类的层次自动向上继承它的间接基类
派生类成员包括:

  • 派生类自己定义的成员
  • 直接基类中的所有成员
  • 所有间接基类的全部成员
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值