第四章 派生类与继承

一、基类或父类

派生类或子类

1、继承方式有三种:public private protected

默认的是private

2、派生类对基类成员的访问形式:

    (1)内部访问:由派生类中新增加的成员函数对从基类继承来的成员的访问

    (2)对象访问:在派生类的外部,通过派生类的对象对从基类继承来的成员的访问

小结:

protected[基类成员内型]——public[派生类继承方式]——protected

public[基类成员内型]——protected[派生类继承方式]——protected

对于基类的私有成员:可以通过基类提供的公有成员函数访问


二、派生类的构造函数和析构函数

1、执行顺序

(1)当创建派生类对象时

      基类的构造函数——>派生类的构造函数

(2)当撤消派生类对象时

      派生类的析构函数——>基类的析构函数

若所定义的派生类构造函数的函数体为空,仅仅起参数的传递作用

三、调整基类成员在派生类中的访问属性的其他方法

如果在派生类中定义了与基类成员同名的成员,则派生类成员覆盖了基类的同名成员

问题的提出:

  能否使私有继承的派生类的对象访问基类的公有成员或保护成员。

解决方法1 :通过公有成员函数间接访问

解决方法2:使用访问声明

注:

(1)访问声明中只能含不带类型和参数的函数名或变量名。

(2)数据成员也可以使用访问声明

(3)访问声明不能改变类成员在基类中原来的性质

(4)对于基类中的重载函数使用访问声明时要慎重

四、多重继承

当一个派生类具有多个基类时,这种派生方法称为多重派生多重继承

易存在二义性

使用成员名限定可以消除二义性,例如:

obj.X∷f();//调用类X的f()

obj.Y∷f();//调用类Y的f()

五、虚基类

为什么要引入虚基类?

如果一个派生类是从多个基类派生出来的,而这些基类又有一个共同的基类,

则在这个派生类中访问这个共同的基类中的成员时,可能会产生二义性。

解决办法2:

为了解决这种二义性,使从不同的路径继承的基类的成员在内存中只拥有一个拷贝,引入了虚基类的概念。[ 如果将公共基类说明为虚基类。那么,对同一个虚基类的构造函数只调用一次(第一次出现的时候调用),这样从不同的路径继承的虚基类的成员在内存中就只拥有一个拷贝]

构造函数执行顺序:B()-> B1()-> B()-> B2()-> D()  引入虚基类后: B()-> B1()-> B2()-> D()

class 派生类名:继承方式 virtual 基类名

{  … }

class  派生类名: virtual 继承方式 基类名

{  … }

引入虚基类的用意


六、基类与派生类对象之间的赋值兼容关系

(1) 可以用派生类对象给基类对象赋值

例如:

Base b;      //定义基类Base的对象b

Derived d;  //定义公有派生类Derived的对象d

b=d;//对象b中数据成员将具有对象d中对应数据成员的值。

说明:所谓赋值仅仅指对基类的数据成员赋值

(2) 可以用派生类对象来初始化基类对象的引用

  例如:

  Base b;          //定义基类Base的对象b

  Derived d;       //定义基类Base的公有派生类

  Base& br=d;   //Derived的对象d , 定义基类Base的对象的引用br,并用派生类Derived的对象d对其初始化

(3) 派生类对象的地址可以赋给指向基类对象的指针

  例如:

  Derived d;    //定义基类Base的公有派生类

  Base* bp=&d;  //Derived的对象d 

把派生类对象的地址&d赋值给指向基类的指针bp,也就是说,使指向基类对象的指针bp指向派生类对象d。

(4) 如果函数的形参是基类对象或基类对象的引用,在调用函数时可以用派生类对象作为实参。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,812评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,987评论 18 399
  • C++类和对象 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心...
    863cda997e42阅读 776评论 0 4
  • 和时间聊天## 因为感冒,回到家抱着电脑坐在床上一不小心睡着了。迷迷糊糊的醒来,以为睡了很久,应该起床上班了。看了...
    木芽阅读 450评论 0 10
  • 《明代粮长制度》这本书全面的介绍了粮长制度的历史渊源和设立目的、粮长的职务和特权、粮长制度的演变和粮长的阶级分化及...
    麋鹿姑苏阅读 1,548评论 0 3

友情链接更多精彩内容