补充C++3_继承和派生类

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

继承和派生类课程内容继承和派生的基本概念单一继承访问权限和赋值兼容规则多重继承构造函数与析构函数调用顺序两义性及其支配规则虚基类课程内容继承和派生的基本概念单一继承访问权限和赋值兼容规则多重继承构造函数与析构函数调用顺序两义性及其支配规则虚基类继承和派生的基本概念继承(inheritance):建造新的派生类。派生类从一个或多个以前定义的基类继承数据和函数,同时增加或重新定义数据和操作。这就产生了类的层次性。举例:“狗”与“黑狗”“黑狗”的一般描述:哺乳、四条腿、爱啃骨头….、黑毛。换一种描述方法:黑狗就是具有黑毛的狗。继承和派生的基本概念继续上例黑狗是黑毛的狗反映了“狗”和“黑狗”这两个概念之间的内在联系在继承机制下,“黑狗”自动拥有了“狗”这一特殊群体的所有特性继承和派生的基本概念两个定义:(1)继承:派生类自动地将基类的所有成员作为自己的成员。(2)派生:通过特殊化已有的类来建立新类的过程。原有的类称为基类(父类),新建的类称为派生类(子类)。继承和派生的基本概念派生是C++语言最重要的特性之一。它是建立在客观世界中实际存在的层次性上。人派生:教师派生:学生派生:工人继承和派生的基本概念当从现存类中派生出新类时,可采用如下变化方式:(1)增加新的成员变量(成员数据)(2)增加新的成员函数(3)重新定义已有成员函数(即重载)(4)改变现有成员的属性(重新给成员数据赋值)继承和派生的基本概念C++中有两种继承方式:(1)单一继承:派生类只能由一个基类例子形成一棵倒置的树(2)多重继承:派生类可以有一个或多个基类例子形成有向无环路的图单一继承例子图形开放图元封闭图元多边形圆线三角形梯形长方形椭圆圆柱体点多重继承例子父亲的性格姨母的性格母亲的性格伯父的性格……..人的性格继承和派生的基本概念基类定义了对象的一个集合,而派生类通过在基类已有特性的基础上同过增加新的成员特性限制了基类的定义,以获得基类定义的对象集合的一个子集基类对象集派生类对象集继承和派生的基本概念从编码角度讲,派生类从基类中以较低的代价换来了大量的灵活性。如果基类可靠,则调试时只需测试派生类中所做的修改即可。性质约束:对父类的性质加以限制或删除。性质扩展:增加父类的性质课程内容继承和派生的基本概念单一继承访问权限和赋值兼容规则多重继承构造函数与析构函数调用顺序两义性及其支配规则虚基类单一继承一般格式:class派生类名:访问控制基类名{private:成员说明列表public:成员说明列表};单一继承例一般格式:classBlackDog:publicDog{private:……public:……};派生类访问控制基类举例1classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“H=“H“”“W=”Wendl;}};派生类基类想在show()中输出X和Y的值,能否在show()中添加如下代码:coutXYendl;类的保护成员C++规定,派生类的成员函数可以直接访问基类中定义的或基类(从另一个基类)继承来的公有成员,但不能访问基类的私有成员。派生类的函数要访问基类的私有成员,方法:将基类的私有成员改为保护成员。保护成员(protected):对于派生类成员函数而言,可以被访问;它是公有成员,对于其他类成员函数,它是私有的,不能被访问。(当作私有成员使用,但可以被派生类的函数访问)派生类要访问基类的私有成员classLocation{protected:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“X=“X“”“Y=”Y“”“H=“H“”“W=”Wendl;}};保护成员:基类把它看作是私有成员,但可被派生类的成员函数访问在派生类中访问基类的保护成员练习:阅读程序,写出程序运行结果classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“X=“X“”“Y=”Y“”“H=“H“”“W=”Wendl;}};编译错,因为无主函数!练习:以下程序要输出H=200请将程序的主函数补充完整(6分钟)classLocation{protected:intX;public:voidsetX(intmyx){X=myx;}voidshowX(){cout“beign”Xendl;}};classRectangle:publicLocation{private:intH;public:voidsetH(intmyh){H=myh;}voidshowH(){cout“H=”Hendl;}};voidmain(){}?练习答案:以下程序要输出H=200请将程序的主函数补充完整classLocation{protected:intX;public:voidsetX(intmyx){X=myx;}voidshowX(){cout“beign”Xendl;}};classRectangle:publicLocation{private:intH;public:voidsetH(intmyh){H=myh;}voidshowH(){cout“H=”Hendl;}};voidmain(){}Rectangler;r.setH(200);r.showH();课程内容继承和派生的基本概念单一继承访问权限和赋值兼容规则多重继承构造函数与析构函数调用顺序两义性及其支配规则虚基类访问权限和赋值兼容规则类的派生其目的为提高代码重用性。访问控制决定了基类各成员在派生类中的访问权限。访问控制在类派生中主要有两类公有派生(public)私有派生(private)公有派生前述例1中使用的派生就是公有派生.在公有派生情况下,基类成员的访问权限在派生类中保持不变。包括:o基类的公有成员在派生类中仍是公有的o基类的保护成员在派生类中仍是保护的o基类的不可访问的和私有的成员在派生类中仍然是不可访问的派生类中存在第四种访问级别:不可访问(inaccessible)P67公有派生(以下代码什么地方有错?)classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“X=“X“Y=”Y“”“H=“H“”“W=”Wendl;}};公有派生不可访问,因为X和Y在基类中为私有成员怎样显示基类中X和Y的值?公有派生:如何在派生类中显示基类的私有成员值(运行结果是什么?)classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“H=“H“W=”Wendl;showxy();}};可访问基类的公有成员运行结果?无结果,编译错,因为没有主函数正确程序(运行结果是什么?)classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“H=“H“W=”Wendl;showxy();}};voidmain(){Rectangler;r.setH(10);r.setW(20);r.show();}运行结果classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“H=“H“W=”Wendl;showxy();}};voidmain(){Rectangler;r.setH(10);r.setW(20);r.show();}X=-85796Y=-85796H=10W=20成员X和Y没有初始化完整程序:在派生类中调用基类公有函数给私有成员赋值classLocation{private:intX,Y;public:voidsetX(intmyx){X=myx;}voidsetY(intmyy){Y=myy;}voidshowxy(){cout“X=”X“”“Y=”Yendl;}};classRectangle:publicLocation{private:intH,W;public:voidsetH(intmyh){H=myh;}voidsetW(intmyw){W=myw;}voidshow(){cout“H=“H“W=”Wendl;setX(100);setY(200);showxy();}};voidmain(){Rectan

1 / 57
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功