08_类的继承(二)

上传人:第*** 文档编号:54451790 上传时间:2018-09-13 格式:PPT 页数:47 大小:1.53MB
返回 下载 相关 举报
08_类的继承(二)_第1页
第1页 / 共47页
08_类的继承(二)_第2页
第2页 / 共47页
08_类的继承(二)_第3页
第3页 / 共47页
08_类的继承(二)_第4页
第4页 / 共47页
08_类的继承(二)_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《08_类的继承(二)》由会员分享,可在线阅读,更多相关《08_类的继承(二)(47页珍藏版)》请在金锄头文库上搜索。

1、第八章 类的重用,清华大学 郑 莉,学习目录,1 派生类的定义 2 继承方式 公有继承 私有继承 保护继承 3 派生类的构造函数和析构函数,派生类的构造函数,派生类对象也要通过构造函数进行初始化。 派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。,1调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2对成员对象进行初始化,初始化顺序按照它们在类中声明的顺序。 3执行派生类的构造,4,8.2 类的继承,构造函数的执行顺序,派生类构造函数形式(一),派生类名:派生类名(基类所需的形参,派生类

2、成员所需的形参) :基类名(形参表) 本类成员初始化赋值语句; ;,派生类构造函数名,1、基类构造函数所要求的参数,需要在派生类构造函数的初始化 列表中指定。 2、基类的构造函数先被调用。 3、再调用派生类的构造函数。,派生类构造函数形式(二),派生类名:派生类名(派生类成员所需的形参) 本类成员初始化赋值语句; ;,派生类构造函数名,1、如果派生类的构造函数没有在初始化列表中显式地指定基类 构造函数的参数,基类的默认构造函数(无参数)就会被调用。 2、再调用派生类的构造函数。,1调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2对成员对象进行初始化,初始化顺序按照它们在类

3、中声明的顺序。 3执行派生类的构造,7,8.2 类的继承,构造函数的执行顺序,1析构函数的执行顺序与构造函数正好相反。 2对基类析构函数的调用无须显式地表示出来。,8,8.2 类的继承,析构函数的执行顺序,例8-6:家具类之间的继承关系,Furniture(家具),type mat price Furniture() getMaterial() getPrice() getType(),Bed(床),seats Sofa() getSeats(),Sofa(沙发),bedtype Bed() getBedType(),/Furniture.h #include #include using n

4、amespace std;class Furniture /“家具”类string type; /家具类型string mat; /家具主材料double price; /家具价格 public:Furniture(string type, string mat, double price): type(type),mat (mat),price(price)string getMaterial() return mat; double getPrice() return price; string getType() return type; ;,10,8.2 类的继承8.2.4派生类的构造

5、函数和析构函数,Furniture类: 本例的基类,class Sofa: public Furniture /“沙发”类int seats; /座位数 public:Sofa(string mat,double price,int seats): Furniture(“沙发“, mat,price), seats(seats)int getSeats() return seats; ;,11,8.2 类的继承8.2.4派生类的构造函数和析构函数,Sofa类: Furniture的公有派生类,派生类构造函数 注意初始化列表的写法,class Bed :public Furniture /“床”

6、类string bedtype; /床类型 public:Bed(string mat,double price,string bedtype): Furniture(“床“, mat,price),bedtype(bedtype)string getBedType() return bedtype; ;,12,8.2 类的继承8.2.4派生类的构造函数和析构函数,Bed类: Furniture的公有派生类,派生类构造函数 注意初始化列表的写法,/8-6.cpp #include“Furniture.h“ int main( )Bed bed(“木材“, 1700, “双人“);Sofa so

7、fa(“塑料“,800,1);coutbed.getType()“:主材料=“bed.getMaterial( )“ 价格=“bed.getPrice( )“ 类型=“ bed.getBedType( )endl;coutsofa.getType()“:主材料=“sofa.getMaterial( )“ 价格=“sofa.getPrice( )“ 座位数=“sofa.getSeats( )endl;return 0; ,13,8.2 类的继承8.2.4派生类的构造函数和析构函数,运行结果: 床: 主材料=木材 价格=1700 类型=双人 沙发: 主材料=塑料 价格=800 座位数=1,例8-7

8、:通过一个派生类的构建和析构过程,观察构造函数和析构函数的调用顺序。,14,8.2 类的继承8.2.4派生类的构造函数和析构函数,/Destructor.h #include using namespace std;class AA public:AA() cout“AA “; AA() cout“AA “; ;,class CC: public BB public:CC() cout“CC “; CC() cout“CC “; ;/8-7.cpp #include“Destructor.h“ int main()CC *p= new CC;delete p;coutendl;return 0

9、; ,15,8.2 类的继承8.2.4派生类的构造函数和析构函数,/Destructor.h #include using namespace std;class AA public:AA() cout“AA “; AA() cout“AA “; ;class BB: public AA public:BB() cout“BB “; BB() cout“BB “; ;,AA:基类,BB:AA的公有派生类,CC:BB的公有派生类,运行结果: AA BB CC CC BB AA,自测题:,派生类的构造函数初始化列表中必须包含直接基类的构造函数。 ( ),自测题:,如果基类的构造函数不带参数,则定义

10、一个派生类的对象时,不一定要调用基类的构造函数。 ( ),自测题:,下列关于派生类的描述中,正确的是( )。A. 派生类的构造函数初始化列表中必须包含对基类构造函数的调用 B. 派生类可以继承多个基类 C. 派生类对基类默认的继承方式为public D. 派生类不可以作为其他类的基类,课后习题,选择题:12 填空题:3,学习目录,1 派生类的定义 2 继承方式 公有继承 私有继承 保护继承 3 派生类的构造函数和析构函数 4 赋值兼容规则(向上转型),8.2.5 向上转型,向上转型,有个更常用的名词:赋值兼容规则。 赋值兼容规则发生在具有继承关系的类之间,具体指的是:在所有需要使用基类对象的地

11、方都可以使用公有派生类对象来代替。,21,8.2 类的继承,通常,一种类型的指针不能指向另一种类型的对象,但派生类是个重要例外: 一个公有派生类对象的指针可以赋值给一个基类指针 称之为:向上转型,向上转型(赋值兼容规则),一个公有派生类对象的指针值可以赋值给(或初始化)一个基类指针。 一个公有派生类对象可以初始化一个基类引用。 一个公有派生类对象可以赋值给一个基类对象。,22,8.2 类的继承,注意:反之不行 (基类对象不可以赋值给派生类对象),利用这样的指针或引用,只能访问派生类对象中从基类继承过来的成员,无法访问派生类的自有成员。,例8-8:家具类中的向上转型,/Furniture.h #

12、include #include using namespace std; class Furniture /家具类 private: string type; /家具类型string mat; /家具主材料double price; /家具价格 public:Furniture();Furniture(string type, string mat, double price): type(type),mat (mat),price(price)string getMaterial() return mat; double getPrice() return price; string ge

13、tType() return type; ;,23,8.2 类的继承8.2.5向上转型,Furniture、Sofa、Bed类的定义同例8_6,class Sofa: public Furniture /沙发类 private: int seats; /座位数 public:Sofa(string mat,double price,int seats):Furniture(“沙发“,mat,price), seats(seats)int getSeats() return seats; ; class Bed :public Furniture /床类 private:string bedty

14、pe; /床类型 public:Bed(string mat,double price,string bedtype):Furniture(“床“,mat,price),bedtype(bedtype)string getBedType() return bedtype; ;,24,8.2 类的继承8.2.5向上转型,/8-8.cpp #include #include“Furniture.h“void show (Furniture *f) cout getType( )getMaterial( )getPrice( )endl; ,25,8.2 类的继承8.2.5向上转型,show函数的形

15、参是: 基类对象指针,int main() Sofa sofa1(“木材“,870.00,3);Bed bed1(“木材“,1280.00,“双人“); Furniture *sofa2=new Sofa(“钢材“,410.00,1); Furniture ,26,8.2 类的继承8.2.5向上转型,用派生类指针初始化基类指针,用派生类对象初始化基类引用,派生类对象赋值给基类对象,运行结果: 家具类型:沙发 主材料:木材 价格:870 家具类型:沙发 主材料:钢材 价格:410 家具类型:床 主材料:木材 价格:1280 家具类型:床 主材料:竹子 价格:1280,自测题:,根据赋值兼容规则,公有派生类对象可以赋值给基类的引用,这时,通过引用可以调用在派生类中新增加的公有成员函数。 ( ),自测题:,只有公有派生类才可以认为是基类的子类型,二者之间才存在赋值兼容规则。( ),自测题:,下面有关基类与公有派生类的,正确的是( )。A. 公有派生类对象不能赋给基类对象 B. 基类对象不能赋给公有派生类对象 C. 公有派生类对象地址不能赋给基类指针变量 D. 基类对象能赋给其公有派生类的引用,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号