第8章 继承与派生2
c++面向对象课后答案第8章
1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。
1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。
1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。
1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。
在派生类中采用虚基类或作用域分辨符来消除该问题。
2.简答题2.1 派生类如何实现对基类私有成员的访问?2.2什么是类型兼容规则?2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的?2.4继承与组合之间的区别与联系是什么?2.5什么是虚基类?它有什么作用?含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化?3.选择题3.1下面对派生类的描述中,错误的是(D )。
A.一个派生类可以作为另外一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类中保持不变3.2下列对友元关系叙述正确的是(A)。
A.不能继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。
A.任何成员B.公有成员和保护成员C.公有成员和私有成员D.私有成员3.4设置虚基类的目的是(B)。
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C )。
第8章 C++重载
13
8-3 返回值和返回地址
如果+以引用返回 :
RMB& operator +(RMB& s1,RMB& s2) { unsigned int jf = s1.jf+s2.jf;
引用返回导致了调用者 unsigned int yuan=s1.yuan+s2.yuan ;
};
前后增量操作的意义, 决定了其不同的返回 方式。前增量运算符 返回引用,后增量运 算符返回值。
20
为了区别前增量与后增量, 除此之外没有任何作用。
8-4 运算符作为成员函数
++ 的成员形式的重载
Increase & Increase::operator ++()
{ value++; //先增量 return *this; //再返回原对象 } Increase Increase::operator ++(int) { Increase temp(*this); //临时对象存放原有对象值 value++; //原有对象增量修改 return temp; //返回原有对象值 }
9
8-2 运算符重载
下面的程序将运算符+和++声明为人民币类的 友元:
class RMB
{
public: RMB(unsigned int d, unsigned int c); friend RMB operator +(RMB&, RMB&); friend RMB& operator ++(RMB&); void display(){ cout <<(yuan + jf / 100.0) << endl; } protected: unsigned int yuan; unsigned int jf; };
第章继承和派生ppt课件
#include "iostream.h"
class D: private B
{ int z;
public :
void Setz(int c) {z=c;}
void Setbase(int a, int b)
{x=a;
//对于派生类,仍是公有
y=b;
}
int Getbx() {return Getx();}
public
{ private : < 私有成员> ; public :
< 公有成员> ; protected : < 被保护成员> ;
}
, public
例: 11-4
class A
{protected :
//保护成员
int w;
public :
void Setw(int a) {w=a;}
int Getw(){return w;}
//私有派生时,
基类中的公有成员不能直接访问
d.Setz(3);
cout<<"x="<<d.Getbx()<<endl;
cout<<"y="<<d.Getby()<<endl;
cout<<"z="<<d.Getz()<<endl;
cout<<"sum="<<d.Sum()<<endl;
};
11.1.4 保护成员 对于派生类,它是公有的;对于外部程序,它是私
#include "iostream.h" void main()
oop_8
HScrollbar VScrollbar 父类
ScrollableWind
ScrollableWind派生树
子类
创 建 ScrollableWind 对 象时,Port的构造函数 通过3条不同的路径 , 被调用了3次,从而将 显示端口初始化 3次。 即1个子类有3个同名祖 先类,而物理显示端口 只有一个!
2
8.1 多继承类
通过单继承模拟多继承:
多 继 承 机 制 是 C++ 语 言 所 特 有 的 (Java 、 C# 、 SmallTalk等没有)。其他面向对象语言需要描述多继
承类的对象时,常常通过对象成员或委托代理实现 多继承。
委托代理在多数情况下能够满足需要,但当对象成
员和基类类型相同或存在共同的基类时,就可能对 同一个物理对象重复进行初始化(可能是危险的和不 需要的)。
第8章 多继承类
本章内容:
8.1 多继承类 8.2 虚基类 8.3 派生类成员 8.4 构造与析构 8.5 类的存储空间
1
8.1 多继承类
多继承的特点:
①单继承是多继承的一种特例,多继承派生类具有更 强的类型表达能力。
②多继承派生类有多个基类或虚基类。 ③派生类继承所有基类的数据成员和成员函数。 ④派生类在继承基类时,不同的基类可以采用不同的 派生控制。 ⑤基类之间的成员可能同名,基类与派生类的成员也 可能同名。在出现同名时,如面向对象的作用域不 能解析,应该使用作用域运算符来指明所要访问的 类的成员。
struct E:A{ E( ) { cout<<'E';} };
struct F:B, virtual C{ F( ) { cout<<'F';} };
%AB%98级语言C++程序设计(第一版)-第八章
202第八章继承与派生(Inheritance and Derive)第八章 继承与派生(Inheritance and Derive) C++程序用不同的类定义来表示一组数据及对这些数据的操作,往往在不同的类之间有某种关系,除了上一章介绍的包含关系和友元关系之外,更多的是继承与派生关系。
例如,一个公司或工厂的计算机管理系统,与设备有关的数据,如设备登号、设备购入时间、设备价值等数据及若干操作的可以构成一个类。
交通工具是设备中的一类,它除了作为设备具有一般性之外,又会有一些作为交通工具的特定数据及操作,如它应有由公安机关发给的牌照号等。
又如汽车,它是交通工具的一种。
司机姓名、牌号,可能是它特有的数据。
而货车、轿车、大客车又是汽车中的不同集合,与它们分别相关的又会有不少数据,如轿车的使用人姓名、货车的吨位、客车的载人数等等,都是它们特有的数据项。
把与设备,交通工具,汽车,轿车,货车,客车相关的数据及操作定义为互不相关的独立的类是不科学的,同时,也会造成许多重复内容,例如,所有这些类,都包括同一个数据成员:设备登记号、购入时间等等。
不同类的定义应反映出类之间的相关关系,反映出上面例子中的层次关系。
C++语言中提供了类定义的派生和继承的功能,很好地解决了上面提出的问题。
两个类之间的继承关系,若类A是类B的基类,则类B是类A的派生类。
我们首先从下面的实例中学习如何建立类与类之间的继承关系。
8.1 公司雇员档案的管理 公司中的雇员档案的管理是整个公司的管理系统的一个组成部分,其雇员的档案数据内容一般根据雇员在公司中的不同职责和位置而有所区别。
除了一般雇员之外,可能还有管理人员、工程技术人员和高级主管,这些人员也是雇8.1 公司雇员档案的管理203员,但他们又有其特殊性,在数据库中又必须保存某些特定的信息,例如管理人员有级别信息,技术人员有学位、专业信息等等。
因此,在管理软件中所设计的类应反映其层次关系和特殊性,下面的程序是一个简化了的层次模块结构。
《继承性和派生性》PPT课件
继承方式: public private
protected 直接继承
(P)
6
8.1.2 派生类的三种继承方式(续)
表:继承对基类成员的访问能力
公有继承 私有继承 保护继承
J PHV J PHV J PHV
私有 成员
公有 成员
√√√√√√ (私)
√√ (保)
√
保护 成员
√
√
√
(私)
√
√
精选课件ppt
<派生类新定义成员> };
2、多继承
class <派生类名>:<继承方式1> <基类名1>, <继承方式2> <基类名2>...
{ <派生类新定义成员>
};
精选课件ppt
3
8.1.1 派生类的定义格式(续)
3、继承方式 public:公有继承;
private:私有继承;
protected:保护继承; 作用:控制基类中声明的成员在多大的范围内 能被派生类的用户访问;
7
8.1.2 派生类的三种继承方式(续)
说明: 私有成员不参与继承的访问控制;
基类实例(J):与继承方式无关,遵循访问控制 权限的定义;
直接继承(P):可以访问基类中的公有成员和 保护成员,但成员的权限随继承方式而改变;
水平访问(H)=P+J;
垂直访问(V)=P+P;
保护成员:在垂直访问(V)时相当于公有成员, 在水平访问(H)时相当于私有成员;
14
8.1.2 派生类的三种继承方式(续)
{ Location::Move(xOff,yOff); }
int GetX() {return Location::GetX();}
第八章 继承与多态习题(C++)
第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。
(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。
如果强制转换则要注意(6)。
答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。
公有派生可以使其类的(4),所以公有派生是主流。
答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。
这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。
答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。
如有任何不同,则认为是(5)而不是虚函数。
除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。
答案:(1)同虚函数名(2)同参数表(3)同返回类型。
如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。
C++程序设计04737 第5章 类的继承与派生
5.1 类的继承与类的派生
5.1.2 派生类的定义与大小
2.类的大小
1. //[程序5-2]基类与子类占用空间及字节对齐
2. #include <iostream>
3. using namespace std;
4. class BaseClass //基类
5. {
6.
int v1, v2;
7.
派生类中包含了基类的成员变量,且基类
成员变量在前,派生类成员变量在后。基 类占用了12个字节,在此之后要分配派生 类自身的成员变量,一个int型变量和一个 指针变量。在64位系统中,指针占8个字 节。所以派生类的大小=12+4+8=24字节。 32位系统中指针的大小是4字节。
5.1 类的继承与类的派生
5.1 类的继承与类的派生
5.1.3 继承关系的特殊性
//[程序5-3]派生类继承了友元函数
#include <iostream>
using namespace std;
class another;//前向引用声明
class Base//基类
{private: float x;
public: void print(const another &K);};
d.print(ano);//输出: Base: 100
return 0;
}
如果派生类Derived中重写了print(),若还想在函数中访问another的私有成员,则必须将类Derived的print()函数也
声明为another的友元。在类another中需要添加如下声明:
friend void Derived::print(const another &K);//派生类的成员函数声明为本类的友元
第8章 继承、抽象类和接口(第4版)
☻一个类只能有一个直接父类,但是它可以同时实 现若干个接口。一个类实现多个接口时,在 implements子句中用逗号分隑各个接口名。
见教材例 8.13
22
8.4 内部类与匿名类
8.4.1 内部类
☻内部类(成员类):定义在类中的类,可以看成 是外部类的一个成员。主要作用是将逻辑上相关 的类放到一起。
见教材 例8.2
7
8.1 类的继承
8.1.2 在子类中访问父类的成员
☻使用 super 不但可以访问父类的构造方法,还可以访 问父类的成员变量和成员方法,但 super 不能访问在 子类中添加的成员。访问父类成员的格式如下: super.变量名; super.方法名;
见教材 例8.5
11
8.1 类的继承
8.1.4 不可被继承的成员与最终类
☻如果用final来修饰类的成员,则该成员为最终成员。 它们声明为final。 ☻最终类:用final修饰的类。该类不能有子类。 没有初始化则按默认值初始化。 默认。方式:定义时赋值;构造方法赋值。 见例8.6
8.1 类的继承
8.1.5 Object类
☻toString( ) 方法:将调用该方法的对象的内容转换成
字符串,并返回其内容,但返回的是一些没有意义且
看不懂的字符串。若要用该方法返回对象的内容,可
以重新定义该方法以覆盖父类中的此方法以满足需求
☻getClass ()方法:返回调用该方法的对象所属的类
♦ 接口中抽象方法被指定为public,所以类在实现方法时, 必须显示地使用public修饰符。
♦ 接口可以作为一种引用类型来使用,可以声明接口类 型的变量或数组,并用它来访问实现该接口的类的对 20 象。 见教材例 8.11
《VC++程序设计》自学指导
《Visual C++程序设计》自学指导"Visual C++程序设计"是面向计算机类各专业的必修计算机类基础课程。
该课程介绍基本的程序设计技术,包括结构化程序设计方法(SP)、面向对象的程序设计方法(OOP)以及使用Visual C++和MFC开发WINDOWS应用程序的技术。
通过本课程的学习,使学生掌握现代程序设计的基本理论和方法,能用Visual C++进行基本的WINDOWS应用程序设计。
本课程的重点在培养学生的实际应用软件开发能力.通过本课程的学习,在结构化程序设计方法和面向对象的程序设计方法的基本理论研究WINDOWS应用程序开发和MFC编程能力方面达到以下基本要求:1.熟悉计算机程序的基本组成要素,包括数据类型、程序流程、函数和指针等基本概念;2.理解结构化程序设计方法(SP)的理论,掌握“自顶向下,逐步求精”的程序设计技术,可设计含有分支、循环和模块(函数)的程序;3.掌握C++的基本流程控制;4.理解类、对象、封装、继承和多态性等面向对象程序设计(OOP)概念,掌握基本的面向对象程序设计方法;5.理解WINDOWS的消息机制和WINDOWS应用程序的基本结构;6.掌握MFC的基本概念,窗口、资源、图形设备接口、文档/视图结构、对话框和控件等对象的程序设计方法,Visual Studio中的AppWizard、ClassWizard、资源编辑器和调试器等工具的方法,可用Visual C++开发基本的WINDOWS应用程序。
第1章C++入门学习目标1.了解Visual C++的特点。
2.熟悉Visual C++集成开发环境的基本使用方法。
3.学习使用Visual C++编写标准的C++控制台程序。
学习重点1.利用Visual C++编写标准的C++控制台程序。
第2章控制结构学习目标1.掌握结构化程序设计方法的基本思想。
2.熟练使用VC++的基本控制结构。
3.熟练使用VC++的控制语句。
数据库第八章习题答案
第八章习题一、选择填空1.下列对派生类的描述中,( )是错的。
A.一个派生类可以作为另一个派生类的基类;B.派生类至少有一个基类;C.派生类的成员除了它自己的成员以外,还包含了它的基类的成员;D.派生类中继承的基类成员的访问权限到派生类保持不变。
2.派生类的对象对它的基类成员中( )是可以访问的。
A.公有继承的公有成员;B.公有继承的私有成员;C.公有继承的保护成员;D.私有继承的公有成员。
3.对基类和派生类的关系的描述中,( )是错的。
A.派生类是即类的具体化;B.派生类是基类的子集;C.派生类是基类定义的延续;D.派生类是基类的组合。
4.派生类的构造函数的成员初始化列中,不能包含( )。
A.基类的构造函数;B.派生类中子对象的初始化;C.基类的子对象的初始化;D.派生类中一般数据成员的初始化。
5.关于子类型的描述中,( )是错误的。
A.子类型就是指派生类是基类的子类型;B.一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型;C.在公有继承下,派生类是基类的子类型;D.子类型关系是不可逆的。
6.关于多继承二义性的描述中,( )是错误的。
A.一个派生类的两个基类中都有某个同名成员,在派生类中对该成员的访问可能出现二义性;B.解决二义性的最常用的方法是对成员名的限定法;C.基类和派生类中同时出现的同名函数,也存在二义性问题;D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类的成员进行访问时也可能出现二义性。
7.设置虚基类的目的是( )。
A.简化程序;B.消除二义性;C.提高运行效率;D.减少目标代码8.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化( )。
A.与虚基类下面的派生类个数有关;B.多次;C.二次;D.一次9.若类A和类B的定义如下:class A{int i,j;public:void get();//……};class B:A{int k;public:void make();//…….};void B::make(){k=i*j;}则上述定义中,()是非法的表达式。
[计算机软件及应用]第8章第一部分 类与对象
class Date
{
public:
Date( );
// 默认构造函数
void setDate(int,int,int); // 设置年、月、日
17
class 类名
{ private:
私有数据和函数
public:
公有数据和函数
};
大括号后的分号“;”是类定义的结束
标志。类的成员分为数据和函数,分别
称为成员数据和成员函数。成员数据描
述类对象内部数据的结构,成员函数则
用于操作类对象的这些数据。
18
class Date
{ public:
Date( );
public: void putname(char *n); void getname(char *n);
private: long num;
public: void putnum(long n); long getnum();
};Leabharlann 24成员数据的说明 一般说来,类中的成员数据可以是任何类
型的。成员数据说明的形式等同C++程序中 一般变量的定义形式。
第八章 类与对象
1
80年代后期,在计算机软件领域发生了 许多变化,这些变化极大地影响着几乎所 有的程序设计者和系统分析员的工作。面 向对象的程序设计方法: (Object-Oriented Programming)就是其中之一。
OOP并不是一种程序设计语言,而是一 种新概念——关于数据、过程和它们之间 关系的一种新的思考方法。
int X,Y; 只是这里还要使用访问说明符(类型修饰 符)private、public和protected。在说明成员数 据时不再使用修饰符extern、auto、register。
第五章 类的继承与派生
//save as car.h #include "vehicle.h" class car : public vehicle { //派生类car(轿车) public: void setcar(int aw, int ats, float ap, int anc, int ahp) {setvehicle(aw,ats,ap); //调用基类的函数初始化 numbercylinders=anc; horsepower=ahp; } void print( ) { //重定义print( ) vehicle::print( ); //调用基类的函数 cout << "\n cylinders:" << numbercylinders; cout << "\n horsepower:" << horsepower;} private: int numbercylinders; //汽缸数 int horsepower; //马力 };
子类特有的部分
子类名
public、protected 和 private分别表示公有继承、保护 继承和私有继承,定义派生类时三选一。
7
第五章 类的继承与派生
(3)说明 ①public继承 最常见的派生方式。基类成员的访问权限在派生类中保 持不变,派生类成员函数不可直接访问基类的private成员, 可通过基类的公有成员函数或保护成员函数访问。 ②private继承 基类中的所有成员在派生类中都将变为private成员。 派生类成员函数不可直接访问基类的private成员,但可直 接访问基类的public、protected成员,并通过它们访问基 类的private成员。 ③protected继承 基类的public成员在派生类中变为protected成员,基类 的protected和private成员在派生类中保持原来的访问权限。 8
第八章 继承与派生
一般来说,公有派生是绝对主流。
公有派生与私有派生
1. 公有继承(public)。 公有继承的特点是基类的公有成员和保护成员作为派生 类的成员时,它们都保持原有的状态,而基类的私有成员仍 然是私有的。 2. 私有继承(private)。 私有继承的特点是基类的公有成员和保护成员作为派 生类的私有成员,并且不能被这个派生类的子类访问。
基类 派生类 基类 public public Protected protected private private private 不可见 private 派生 派生类 protected 基类 public protected private 派生类 public proteced
不可见
不可见
在派生类对象外 访问派生类对象 的基类成员
可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问
公有派生
私有派生
(1)在公有继承时,派生类的对象可以访问基类中的公有成 员;派生类的成员函数可以访问基类中的公有成员和保护成员。 这里,一定要区分清楚派生类的对象和派生类中的成员函数对 基类的访问是不同的。 (2)在私有继承时,基类的成员只能由直接派生类访问,而 无法再往下继承。
继承与派生的概念 派生类的构造函数与析构函数 多重继承与派生类成员标识 虚基类 类层次中成员名的作用域 类层次中类转换规则 多重继承的应用例子 MFC基础类及其层次结构
继承与派生的概念
层次概念是计算机的重要概念。通过继承(inheritance)的 机制可对类(class)分层,提供类型/子类型的关系。C++通过 类派生(class derivation)的机制来支持继承。继承是类之间定 义的一种重要关系。定义类B时,自动得到类A的操作和数据属性, 使得程序员只需定义类A中所没有的新成分就可完成在类B的定义, 这样称类B继承了类A,类A派生了类B,A是基类(父类),B是 派生类(子类)。这种机制称为继承。 称已存在的用来派生新类的类为基类(base class) ,又称 为 父 类 。 由 已 存 在 的 类 派 生 出 的 新 类 称 为 派 生 类 ( derived class) ,又称为子类。派生类可以具有基类的特性,共享基类 的成员函数,使用基类的数据成员,还可以定义自己的新特性, 定义自己的数据成员和成员函数。基类和派生类的集合称作类继 承层次结构(hierarchy) 在C++语言中,一个派生类可以从一个基类派生,也可以从 多个基类派生。从一个基类派生的继承称为单继承;从多个基类 派生的继承称为多继承。下图反映了类之间继承和派生关系。
C++面向对象程序设计第8章 继承与派生
蚌埠学院计算机系
C++面向对象程序设计
class Studend1 可以看出,很多是重复的地方, 我们可以通过C++语言中的 { int num; //此行原来己有 继承机制,可以扩充和完善旧 char name[20]; //此行原来己有 的程序设计以适应新的需求。 char sex; //此行原来己有 这样不仅可以节省程序开发的 时间和资源,并且为未来程序 int age; 增添了新的资源。 char addr[20]; public: void display( ) ; //此行原来己有 {cout<<"num: "<<num<<endl; //此行原来己有 cout<<"name: "<<name<<endl;//此行原来己有 cout<<"sex: "<<sex<<endl; //此行原来己有 cout<<"age: "<<age<<endl; cout<<"address: "<<addr<<endl;} };
蚌埠学院计算机系
21
C++面向对象程序设计
【例8-3】定义类Point,然后定义类Point的派生类 Circle。 #include <iostream.h> class Point //定义基类,表示点 { private: int x; int y; public: void setPoint(int a, int b){ x=a; y=b; }; //设置坐标 int getX(){ return x; }; //取得X坐标 int getY(){ return y; }; //取得Y坐标 };
第8章PythonPytho程序设计基础教程面向对象编程ppt课件
8.2. 类的继承
面向对象的编程带来的主要好处之一是代 码的重用,实现这种重用的方法之一是通 过继承机制。一个类继承另一个类时,它 将自动获得另一个类的所有属性和方法; 原有的类称为父类,而新类称为子类。子 类继承了其父类的所有属性和方法,同时 还可以定义自己的属性和方法。继承完全 可以理解成类之间的类型和子类型关系。
2. 定义了eat()方法,该方法的参数是self和food:self表示当前 调用eat()的对象,food是一个数字类型参数,表示吃进去的食 物重量,通过self.weight=self.weight+food使得调用eat() 方法的Person对象体重增加,如p1.eat(2)表示Person对象p1 的体重增加2,同时显示信息。
5. 代Байду номын сангаас块4创建了两个不同的Person对象,分别是p1 和p2,分别调用他们的eat()、run()、say()方法。
10
对象属性的默认值设置
可以为属性在__init__()方法中设置默认值,代 码如下:
# 例 8 3在类的定义中加入初始化代码 def __init__(self, name, gender='男', weight=70):
9
3. 定义了run()方法,该方法只有一个参数self,通过s elf.weight=self.weight-1使得调用run()的对象体 重减1,如p1.run(),表示Person对象p1通过跑步 锻炼体重降低了1,同时显示信息。
4. 定义了say()方法,该方法只有一个参数self,通过p rint('My name is %s' % ())语句自我 介绍,如p2.say(),输出“王昭君”,自我介绍。
java程序设计基础第8章
Public class App8_1 {private static void main(String[] args) {Student stu=new Student(); Stu.setNameAge(“张小三”,21); Stu.show(); Stu.setDepartment(“计算机系”);} } 运行结果: 调用了个人类的构造方法Person() 调用了学生类的构造方法Student() 姓名:张小三 年龄:21 我是计算机系的学生 注意:在执行子类的构造方法前,先自动调用父类中没有参数的 构造方法,为继承自父类的成员做初始化操作。
class Student extends Person {private String department; Public Student( ) {System.out.println(“调用了学生类的构造方法 Student()”);} Public void setDepartment(String dep) {department=dep; System.out.println(“我是”+department+”的学 生”);} }
Public class App8_3 {public static void main(String[] args) {Student stu=new Student(“李小四”,“信息 系”); }} 运行结果: 子类Student中的成员变量age=20 姓名:李小四 年龄:25 系别:信息系
第8章继承抽象类和接口信息科学技术学院本章目标?子类的创建?在子类中访问父类的成员?覆盖父类的方法?抽象类与抽象方法?接口及接口的实现?利用接口实现类的多重继承?内部类的匿名类?包一子类的创建猫科动物动物继承父类继承父类子类为什么要用到继承
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
StationWagon(int power, int seat,int load) : 当通过StationWagon类的对象 Wagon(power,load), Car(power,seat) SW访问show ()时,程序出现编译 { 错误。这是因为基类Car和Wagon } 各有一个成员函数show (),在其 void ShowSW() { 共同的派生类StationWagon中就 cout<<"StationWagon:"<<endl; 有两个相同的成员函数,而程序在 Car::show(); Wagon::show(); 调用时无法决定到底应该选择哪一 } 个成员函数。 }; int main() { StationWagon SW(105,3,8); //SW.show(); //错误,出现二义性 SW.ShowSW(); return 0;
class B: public A { private:static int j; A a; public: B(int x):A(x) { cout<<"B="<<++j<<endl; } }; int A::i=0; int B::j=0; int main() { B b(1); }
C + + 语 言 程 序 设 计 教 程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /************************** * p8_6.cpp * * 多继承的二义性 * **************************/ #include<iostream> using namespace std; class Automobile //汽车类 { private: int power; //动力 public: Automobile(int power) { this->power=power; } void show() { cout<<" power:"<<power; } };
继 承 与 派 生
C + + 语 言 程 序 设 计 教 程
ห้องสมุดไป่ตู้
8.3 派生类的构造与析构
1.派生类构造函数的定义
派生类名(参数总表): 基类名1(参数表1),...,基类名m (参数表m), 成员对象名1(成员对象参数表1),...,成员对象名n(成员对象参数表n) { 派生类新增成员的初始化; }
C + + 语 言 程 序 设 计 教 程
第8章 继承与派生
第 8 章
继 承 与 派 生
C + + 语 言 程 序 设 计 教 程
第8章 继承与派生
学习目标
1. 2. 3. 4. 5. 6. 掌握派生与继承的概念与使用方法; 能够运用继承机制对现有的类进行重用; 掌握继承中的构造函数与析构函数的调用顺序; 为派生类设计合适的构造函数初始化派生类; 掌握处理多继承时的二义性问题; 掌握虚基类的概念与使用方法。
第 8 章
继 承 与 派 生
C + + 语 言 程 序 设 计 教 程
第 8 章
继 承 与 派 生
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
第 8 章
继 承 与 派 生
注意: 在继承层次图中,处于同一层次的各基类构造函数的调用顺序 取决于定义该派生类时所指定的各基类的先后顺序,与派生类构 造函数定义时初始化表中所列的各基类构造函数的先后顺序无关。 对同一个基类,不允许直接继承两次。
C + + 语 言 程 序 设 计 教 程
8.5.2 二义性问题
运行结果 StationWagon: car power:105 seat:3 wagon power:105 load:8
小客车类Car和小货车类Wagon 共同派生出客货两用车类 StationWagon,后者继承了前者 的属性power和行为show()。
class StationWagon :public Car, public Wagon //客货两用车类
第 8 章
继 承 与 派 生
【例1】构造函数的调用次序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
class A { private: static int i; int x; public: A(int x=0 ) { cout<<"A="<<++i<<endl; } };
一般来说,在派生类中对于基类成员的访问应该是唯一的,但是,由于多继 承中派生类拥有多个基类,如果多个基类中拥有同名的成员,那么,派生类在继 承各个基类的成员之后,当我们调用该派生类成员时,由于该成员标识符不唯一, 出现二义性,编译器无法确定到底应该选择派生类中的哪一个成员,这种由于多 继承而引起的对类的某个成员访问出现不唯一的情况就称为二义性问题。
继 承 与 派 生
【例1】兼容性
1 2 3 4 5 6
7 8 9 10 11 12 13 14 15 16 17 18 19 20 class A { private: int x; public: A(int x=0 ) { this->x=x; } }; class B: public A { private: int y; public: B(int x,int y):A(x) { this->y=y; } }; int main() { B b(1,2); A a; A &p=b; a=b; }
第 8 章
private
继 承 与 派 生
C + + 语 言 程 序 设 计 教 程
8.3 派生类的构造与析构
1.派生类构造函数的定义
派生类名(参数总表): 基类名1(参数表1),...,基类名m (参数表m), 成员对象名1(成员对象参数表1),...,成员对象名n(成员对象参数表n) { 派生类新增成员的初始化; }
C + + 语 言 程 序 设 计 教 程
8.5 多继承
多继承:是指派生类具有两个或两个以上的直接基类。
8.5.1 多继承的构造与析构
多继承时派生类构造函数执行的一般次序如下:
① 调用各基类构造函数;各基类构造函数调用顺序按照基类被 继承时声明的顺序,从左向右依次进行。 ② 调用内嵌成员对象的构造函数;成员对象的构造函数调用顺 序按照它们在类中定义的顺序依次进行。 ③ 调用派生类的构造函数;
基类名1(参数表1),...,基类名m (参数表m)称为基类成员的初始化 表。 成员对象名1(成员对象参数表1),...,成员对象名n(成员对象参数表 n) 为成员对象的初始化表。 在派生类构造函数的参数总表中,需要给出基类数据成员的初值、 成员对象数据成员的初值、新增一般数据成员的初值。
第 8 章
class Wagon //小货车类 { private: int power; //动力 int load; //装载量 public: Wagon(int power,int load) { this->power=power,this>load=load; } void show() { cout<<"wagon power:"<<power<<" load:"<<load<<endl; } }; { public:
第 8 章
继 承 与 派 生
C + + 语 言 程 序 设 计 教 程
8.6 虚基类
在多继承中,在派生类的对象中,同名数据成员在内存中同时拥有多个拷贝, 同一个成员函数会有多个映射,出现二义性,这种二义性为间接二义性。
【例8-6】多重继承的间接二义性。 假定类Car、Wagon从共同的基类Automobile(汽车)派生出来,程序如下:
8.4 类型兼容
类型兼容是指在公有派生的情况下,一个派生类对象可以 作为基类的对象来使用的情况。类型兼容又称为类型赋值兼 容或类型适应。 在C++中,类型兼容主要指以下三种情况: ① 派生类对象可以赋值给基类对象。 ② 派生类对象可以初始化基类的引用。
第 8 章
③ 派生类对象的地址可以赋给指向基类的指针。
第 8 章
继 承 与 派 生
【例1】派生类的构造函数
1 2 3 4 5 6
7 8 9 10 11 12 13 14 class A { private: int x; public: A(int x ) { this->x=x; } }; class B: public A { private: int y; public: B(int x,int y):A(x) { this->y=y; } };
【例8-5】多继承的二义性。 例如:我们可以定义一个小客车类car和一个小货车类Wagon,它们共同派生出一个客 货两用车类StationWagon。StationWagon继承了小客车的特征,有座位seat,可以载客 ;又继承了小货车的特征,有装载车厢load, 可以载货。程序实现如下: 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Car //小客车类 { private: int power; //动力 int seat; //座位 public: Car(int power,int seat) { this->power=power,this->seat=seat; } void show() { cout<<"car power:"<<power<<" seat:"<<seat<<endl; } };