-
2020-05-31 00:34:51
1.继承和派生的基本概念
继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也成为子类)。
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
派生类一旦定义以后,可以独立使用,不依赖于基类。
派生类拥有基类的全部成员函数和成员变量,不论是private,protected,public。
在派生类的各个成员函数中,不能访问基类中的private成员。需要继承机制的例子:
所有学生都有的共同属性:姓名,学号,性别,成绩。
所有学生都有的共同方法(成员函数):是否该留级,是否该奖励。
而不同的学生,又有各自不同的方法:研究生:导师,系。大学生:系。中学生:竞赛特长加分。2.派生类的写法
class 派生类名:public 基类名
{};
例子:class cstudent{ private: string sname; int nage; public: bool isthreegood(){}; void setname (const string &name){sname=name;} }; class cundergraduantestudent:public cstudent{ private: int ndepartment; public: bool isthreegood(){}; //覆盖 bool canbaoyan(){...}; //修改 };//派 生类的写法是:类名:public 基类名
3.派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前。
更多相关内容 -
继承和派生
2021-03-24 08:38:32理解继承和派生 继承 在C++中,代码重用是通过“继承(inherittance)”机制实现的 所谓“继承”就是在一个已经存在的类基础上,再建立一个新类 从已有的类派生出新的类,派生类就继承了原有类(基类)的特征,...内容预览
- 继承
理解继承
单继承下C++对象模型的内存分配 - 派生类
派生类与基类之间的特殊关系小结
派生类成员的访问控制
继承方式提供给程序员对类进行封装的机制
继承
-
理解继承
在C++中,代码重用是通过“继承(inherittance)”机制实现的
所谓“继承”就是在一个已经存在的类基础上,再建立一个新类 从已有的类派生出新的类,派生类就继承了原有类(基类)的特征,包括成员和方法
继承的功能
可以在已有类的基础上添加新功能,如对于数组类,可以添加数学计算 可以给类添加数据成员,如对于字符串类,可以派生出一个类,并添加指定成员表示颜色 可以修改类方法的行为,如对于普通英雄类,可以派生出拥有更丰富技能的近战英雄类
注意:
继承机制只需提供新特性,甚至不需要访问源码就可以派生出类
只有类方法的头文件和编译后的代码,仍然可以使用库中的类派生出新类 -
demon
方案一:直接定义各个英雄类
方案二:使用继承
注意派生类对象存储了基类的数据成员。 即,派生类继承了基类的实现 派生类对象可以使用基类的非私有函数。 即,派生类继承了基类的接口 派生类需要自己的构造函数 派生类可以根据需要添加额外的数据成员和函数
-
单继承下C++对象模型的内存分配
- 没有继承时,成员变量和成员函数会分开存储
1.编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段代码
2.类可以看做是一种复杂的数据类型,如果使用sizeof求类所占空间的大小,只是计算了成员变量的大小,并没有把成员函数也包含在内
- 有继承关系时的内存模型
派生类的内存模型可以看成是基类成员变量和新增成员变量的总和
所有成员函数仍然存储在另外一个区域——代码区,由所有对象共享
- 没有继承时,成员变量和成员函数会分开存储
-
注意:
派生类的构造函数后于其基类的构造函数调用,但是析构函数先基类析构函数调用
派生类
-
派生类与基类之间的特殊关系小结
-
派生类成员的访问控制
公用继承(public inheritance)基类的公有成员和受保护成员,在派生类中保持原来的访问属性,其私有成员仍为基类
私有继承(private inheritance)
基类的公有成员和受保护成员,在派生类中成为了私有成员,私有成员仍为基类独有
受保护继承(protected inheritance)
基类公有成员和受保护成员,在派生类中成了受保护成员,私有成员仍为基类独有
注意:
1.公有权限下,自己、派生类及外部都可以访问 2.私有权限下,只能自己访问,派生类及外部都无法访问
-
继承方式提供给程序员对类进行封装的机制
1.全部继承,不封装基类,那么用公有继承
2.全部继承,完全封装基类,那么使用私有继承
3.全部继承,有选择封装基类,那么使用受保护继承
不管哪种继承,派生类都不能访问基类的私有成员(除非改成protected)
注意 :以上三种选择是程序员在开发中运用面向对象思想的重要体现: 需要封装哪些成员变量和成员函数? 需要把哪些成员函数作为接口来被调用?
公有继承
受保护继承
私有继承
-
继承与组合
类的组合形式:在一个类中有另外一个类的对象作为数据成员
1.通过继承建立了派生类与基类的关系,它是一种 is - a "是"的关系 比如,狗是哺乳动物,战士是英雄 2.类的组合关系,它们之间不是"是"的关系,而是"有"的关系 比如,学生有书包、战士有武器、机枪有子弹、老板有小蜜 3.继承是纵向的,组合是横向的
继承是C++与C最重要的区别之一
C++源于C,C++最重要的特性就是引入了面向对象机制 C++中通常也可以直接使用C语言的习惯进行编程
- 继承
-
继承和派生复习
2021-01-20 22:06:48继承和派生练习关于保护继承下列说法错误的是保护继承的特点是基类的所有公用成员和保护成员都成为派生类的保护成员派生类对象不能访问基类中的任何成员派生类的对象可以访问基类的公有成员保护继承的派生类和私有继 -
C++继承和派生
2019-01-17 16:15:55信息科学技术学院《程序设计实习》,C++程序员入门级教程 -
c++继承和派生(个人总结笔记)
2021-08-19 19:54:35一、继承和派生 1、C++继承的概念及语法 继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheritance) 可以理解为一个类从另一个类获取成员变量...c++继承和派生(个人总结笔记)
一、继承和派生
1、C++继承的概念及语法
-
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。
-
继承(Inheritance) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。
-
继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。
-
demo语法
class 派生类名:[继承方式] 基类名{
派生类新增加的成员
};//基类 Pelple class People{ } //派生类 Student class Student: public People{ }
Student 类继承了 People 类的成员成员函数 。这些继承过来的成员,可以通过子类对象访问,就像自己的一样。
2、C++继承权限和继承方式
public、protected、private 指定继承方式
不同的继承方式会影响基类成员在派生类中的访问权限- public继承方式
- 基类中所有 public 成员在派生类中为 public 属性;
- 基类中所有 protected 成员在派生类中为 protected 属性;
- 基类中所有 private 成员在派生类中不能使用。
- protected继承方式
- 基类中的所有 public 成员在派生类中为 protected 属性;
- 基类中的所有 protected 成员在派生类中为 protected 属性;
- 基类中的所有 private 成员在派生类中不能使用。
- private继承方式
- 基类中的所有 public 成员在派生类中均为 private 属性;
- 基类中的所有 protected 成员在派生类中均为 private 属性;
- 基类中的所有 private 成员在派生类中不能使用。
- 由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限,导致继承关系复杂,所以实际开发中我们一般使用 public。
- 改变访问权限
using 关键字可以改变基类成员在派生类中的访问权限,例如将 public 改为 private、将 protected 改为 public。
3、C++继承时的名字遮蔽
如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。
- 基类成员函数和派生类成员函数不构成重载
基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解,对于成员函数要引起注意,不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样。
4、C++派生类构造函数
- 基类的成员函数可以被继承,可以通过派生类的对象访问;
- 类的构造函数不能被继承。
- 在派生类的构造函数中调用基类的构造函数。
Student::Student(char *name, int age, float score): People("小明", 16), m_score(score){ }
- 派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
- 通过派生类创建对象时必须要调用基类的构造函数,这是语法规定。 换句话说,定义派生类构造函数时最好指明基类构造函数;如果不指明,就调用基类的默认构造函数(不带参数的构造函数);如果没有默认构造函数,那么编译失败。
5、派生类的析构函数
- 和构造函数类似,析构函数也不能被继承。(不用程序员显示调用、编译器负责)
- 外析构函数的执行顺序和构造函数的执行顺序也刚好相反。
- 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。
- 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。
6、C++虚继承和虚基类
- 多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。(容易产生问题,命名冲突。)
- 虚继承(Virtual Inheritance)
为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。在继承方式前面加上 virtual 关键字就是虚继承
//间接基类A class A{ protected: int m_a; }; //直接基类B class B: virtual public A{ //虚继承 protected: int m_b; };
- 虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)
7、C++虚继承时的构造函数
- 虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。
- 这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
D::D(int a, int b, int c, int d): A(a), B(90, b), C(100, c), m_d(d){ } void D::display(){ cout<<"m_a="<<m_a<<", m_b="<<m_b<<", m_c="<<m_c<<", m_d="<<m_d<<endl; }
- 例子:
- 在最终派生类 D 的构造函数中,除了调用 B 和 C 的构造函数,还调用了 A 的构造函数,这说明 D 不但要负责初始化直接基类 B 和 C,还要负责初始化间接基类 A。
- 而在以往的普通继承中,派生类的构造函数只负责初始化它的直接基类,再由直接基类的构造函数初始化间接基类
-
-
【Java】继承和派生
2022-03-23 20:43:51如果想声明一个类继承另一个类,需要使用extends关键字 例子: public class A {} public class B extends A{} 构造顺序 子类的构造顺序:编译器会一直上溯...子类不能完全继承父类的所有方法和属性 1 若子类和父继承和派生
如果想声明一个类继承另一个类,需要使用extends关键字
例子:public class A {} public class B extends A{}
构造顺序
子类的构造顺序:编译器会一直上溯到最初类,执行该类构造方法,然后依次执行各子类构造函数,如下;以:A->B->C 顺序来初始化子对象各部分
先执行父类构造方法,再执行子类构造方法,
如果在子类中未显式调用父类构造方法,则编译器会自动调用父类的默认构造方法继承性
子类不能完全继承父类的所有方法和属性
1 若子类和父类在同一个包内,子类可以继承父类中访问权限设定为public、 protected、 default的成员变量和方法,除了private都可以。
2 若子类和父类不在同一个包内,子类可以继承父类中访问权限设定为public、 protected的成员变量和方法。
换言之:
1、private类型的属性或方法不能被继承
2、public、protected类型的属性或方法一定可以被继承
3、defalut 类型要看子类是否和父类在一个包。
例子:
隐藏和重写
1 属性隐藏
同名
子类对象在寻找方法或成员变量的时候,先搜索子类独有空间,在搜索父类空间
2 方法重写要求:
两同两小一大:
两同:
方法名相同 参数列表一致
两小:
子类返回值类型应该更小或者相等
子类的抛出的异常小于等于父类的抛出的异常类
一大:
子类的访问权限比父类访问权限要大和相等
例子:
1
2
3
总结
(1) 变量只能被隐藏(包括静态和非静态)(2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量
(3) 静态方法(static)只能被隐藏,不能被重写;
(4) 非静态方法可以被重写;
(5) 不能用子类的静态方法隐藏父类中的非静态方法,否则编译会报错;
(6) 不能用子类的非静态方法覆盖父类的静态方法,否则编译会报错;
super的用法
1 使用super调用父类的构造方法
父类构造方法不能继承 ,所以
只有子类的构造方法采用super调用父类的构造方法,其它方法调用出错
super调用,必须是方法体中的第一条语句,否则出错
2 可以利用super调用父类的属性1和方法
3
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
调用this()必须写在构造方法的第一行,
调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super()
所以,不能同时用super和this关键词final
1、修饰变量,为常量,值不可变;
对基本类型来说是其值不可变,而对 对象属性来说其引用不可再变,引用空间的值是可以改变的
fianl修饰属性必须初始化,初始化只能在初始化可以在两个地方:
一是其定义处、二是在构造函数中。
2、修饰对象,值可变,引用不变;
3、修饰方法,方法不可重写,可被继承(可以直接使用);
即 在声明类中,一个 final 方法只被实现一次
4、修饰类,无子类,不可以被继承,更不可能被重写。
对象的多态性
上转型
因为子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型由系统自动完成。
例如:父类 对象名称=new 子类()Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。
编译时(父类 对象名称)按照父类对象看待,
运行时( new 子类() )实际是子类对象。,输出子类的结果1 对象的实例变量并不具备多态性。
2 与方法不同的是,类的静态变量和静态方法并不具备多态性
下转型
先new上转型,再下转型(强制)
不能直接new,强制
-
c++继承和派生.doc
2022-01-13 10:44:43根据c++第三版梳理的知识点。描述了第12章节继承和派生的知识点 -
代码讲解C++继承和派生
2020-12-31 16:54:27继承是是指一个对象直接使用另一对象的属性和方法。 继承的作用: 1.描述客观事物的层次结构 2.分类的方法进行分析和描述 3.复杂的系统层次化,提高代码的重用性 4.增强语言功能,提高软件开发效益 继承分为单... -
C++继承和派生实例
2014-12-29 10:28:49入门基础实例 有关继承和派生的应用小程序 希望对大家有帮助 -
继承和派生向量类模板和字符串类
2012-11-10 21:56:53给定一个头文件Vec.h,其中有抽象类模板VECROR设计。还有插入运算符重载、抽取运算符重载的普通c++函数...1、将类模板VECTOR作为基类,通过公共继承派生一个新的类模板Vector(向量类)和一个新的自定义字符串了String。 -
4、继承和派生.mmap
2021-02-01 10:58:16继承与派生知识大纲(使用Mindjet MindManager打开) -
类的继承和派生
2019-09-03 23:21:113、类的继承与派生机制允许程序员在保持原有类特性的基础上,进行更具体,更详细的修改和扩充; 4、由原有的类产生新类时,新类便包含了原有类的特征,同时也加入自己所特有的新特性。 二、派生类的定义: 1、... -
C++程序设计与实践08 继承和派生.pptx
2020-01-15 20:58:54第八章 继承和派生;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.1 问题引入;8.2 继承和派生的概念;8.2 继承和派生的概念;8.2 继承和派生的概念;8.2 继承和派生... -
继承和派生PPT学习教案.pptx
2021-10-11 05:21:22继承和派生PPT学习教案.pptx -
C++继承与派生类习题.pdf
2020-06-26 12:39:37第九章继承与派生类 92 典型例题分析与解答 例题 1下列对派生类的...答案D 分析一个派生类可以作为另一个派生类的基类无论是单继承还是多继承派生类至少有 一个基类派生类的成员除了它自己的成员外还包含了它的基类成员 -
C++类的继承和派生
2020-04-03 17:41:50由于学生也是人类,所以可以继承人类这个类中的方法和属性。 类man称为父类、基类或者超类 类Student称为派生类、子类 UML图: 类成员的访问控制和继承 √——可以访问 ×——不可以访问 类不想被访问的私有数据... -
C++第七章 继承和派生(二).ppt
2022-06-16 01:57:07C++第七章 继承和派生(二).ppt -
C++第七章 继承和派生(一).ppt
2022-06-16 01:57:07C++第七章 继承和派生(一).ppt -
C继承和派生类PPT课件.pptx
2021-10-24 12:18:26C继承和派生类PPT课件.pptx -
C++课件第十一章继承和派生类教学材料.ppt
2020-06-05 01:04:02第十一章 继承和派生类;类是一种抽象数据类型是对具有共同属性和行为的对象(事物)的抽象描述; 一个类继承另一个类时这个类被称为继承类派生类或子类另一个类被称为被继承类基类或父类 继承类包含了被继承类中的所有... -
继承和派生类PPT学习教案.pptx
2021-10-11 05:21:24继承和派生类PPT学习教案.pptx -
第 继承和派生PPT学习教案.pptx
2021-10-03 11:01:02第 继承和派生PPT学习教案.pptx -
Java程序设计:chapter05 类的继承和派生.ppt
2022-06-20 22:21:36Java程序设计:chapter05 类的继承和派生.ppt -
C++全套学习课件继承和派生.pdf
2021-09-30 11:36:28C++全套学习课件继承和派生.pdf -
C++程序设计与实践:09-继承和派生.ppt
2022-06-12 23:20:41C++程序设计与实践:09-继承和派生.ppt