C++ 继承和派生

概念:

继承和派生
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。派生类一经定义后,可以独立使用,不依赖于基类。

创建派生类的对象时:

  1. 先执行基类的构造函数,用以初始化派生类对象中从基类继承的成员;
  2. 再执行成员对象类的构造函数,用以初始化派生类对象中成员对象。
  3. 最后执行派生类自己的构造函数

析构函数的调用顺序和构造函数相反

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

派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。 在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前

公有继承(is-a关系):

  • 派生类拥有基类的全部成员函数和成员变量,不论是private、 protected、 public 。
  • 在派生类的各个成员函数中,不能访问基类中的private成员,只可以访问其公有和保护成员。

public继承的赋值兼容规则

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

但是即便基类指针指向的是一个派生类的对象,也不能通过基类指针访问基类没有,而派生类中有的成员。
如果派生方式是 private或protected,则上述三条不可行

私有继承、保护继承、对象成员(has-a关系):

  • protected继承时,基类的public成员和protected成员成为派生类的protected成员。保护继承与私有继承仅在第三代类及以后有差别。
  • private继承时,基类的public成员和protected成员成为派生类的private成员,这意味着基类方法不会成为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们。访问基类对象本身:使用强制类型转换将(*this)转换成想访问的基类对象的类型
  • 对于继承的对象,构造函数在成员初始化列表中使用类名来调用特定的基类构造函数。对于对象成员,构造函数则使用成员名。
  • 通常应使用对象成员来建立 has-a 关系,但如果需要访问基类的保护成员,或需要重新定义虚函数,则应使用私有继承。
  • 使用using 可以重新定义访问权限,在public中使用using声明来指出派生类可以使用的特定基类成员,即使采用的是私有派生。

直接基类与间接基类

  • 在声明派生类时, 只需要列出它的直接基类
  • 派生类沿着类的层次自动向上继承它的间接基类
  • 派生类的成员包括
    • 派生类自己定义的成员
    • 直接基类中的所有成员
    • 所有间接基类的全部成员

对象指针(know关系):

即类中含有其他类的对象指针或对象指针数组成员。
逻辑上比较典型的关系是户主与狗的关系:一个户主可以有多只狗,一只狗只能有一个主人,此时户主类中就应包含一个狗类对象指针数组,而狗类中应包含一个户主类对象指针。

友元类(控制关系):

语法:friend class 类名;//此声明可在类中的任何位置
友元类可以使用原来中的任何成员。
典型的逻辑关系:遥控器与电视:遥控器可以控制电视进行一些操作,而遥控器既不属于电视,又不是电视,此时就应将遥控器类声明为电视类的友元类

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值