第8章 继承与派生2

合集下载

c++面向对象课后答案第8章

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++重载

第8章 C++重载
operator++()确实修改了它的参数, 而且其返回值要求 是左值,这个条件决定了它不能以值返回
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课件

第章继承和派生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

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++程序设计(第一版)-第八章

%AB%98级语言C++程序设计(第一版)-第八章

202第八章继承与派生(Inheritance and Derive)第八章 继承与派生(Inheritance and Derive)  C++程序用不同的类定义来表示一组数据及对这些数据的操作,往往在不同的类之间有某种关系,除了上一章介绍的包含关系和友元关系之外,更多的是继承与派生关系。

 例如,一个公司或工厂的计算机管理系统,与设备有关的数据,如设备登号、设备购入时间、设备价值等数据及若干操作的可以构成一个类。

 交通工具是设备中的一类,它除了作为设备具有一般性之外,又会有一些作为交通工具的特定数据及操作,如它应有由公安机关发给的牌照号等。

 又如汽车,它是交通工具的一种。

司机姓名、牌号,可能是它特有的数据。

而货车、轿车、大客车又是汽车中的不同集合,与它们分别相关的又会有不少数据,如轿车的使用人姓名、货车的吨位、客车的载人数等等,都是它们特有的数据项。

 把与设备,交通工具,汽车,轿车,货车,客车相关的数据及操作定义为互不相关的独立的类是不科学的,同时,也会造成许多重复内容,例如,所有这些类,都包括同一个数据成员:设备登记号、购入时间等等。

 不同类的定义应反映出类之间的相关关系,反映出上面例子中的层次关系。

C++语言中提供了类定义的派生和继承的功能,很好地解决了上面提出的问题。

 两个类之间的继承关系,若类A是类B的基类,则类B是类A的派生类。

我们首先从下面的实例中学习如何建立类与类之间的继承关系。

 8.1 公司雇员档案的管理  公司中的雇员档案的管理是整个公司的管理系统的一个组成部分,其雇员的档案数据内容一般根据雇员在公司中的不同职责和位置而有所区别。

除了一般雇员之外,可能还有管理人员、工程技术人员和高级主管,这些人员也是雇8.1 公司雇员档案的管理203员,但他们又有其特殊性,在数据库中又必须保存某些特定的信息,例如管理人员有级别信息,技术人员有学位、专业信息等等。

因此,在管理软件中所设计的类应反映其层次关系和特殊性,下面的程序是一个简化了的层次模块结构。

《继承性和派生性》PPT课件

《继承性和派生性》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++)

第八章   继承与多态习题(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章 类的继承与派生

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);//派生类的成员函数声明为本类的友元
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; } };
相关文档
最新文档