设为首页 加入收藏

TOP

C++学习笔记之继承(一)
2015-07-20 17:53:34 来源: 作者: 【 】 浏览:4
Tags:学习 笔记 继承
一、基类和派生类
?
很多时候,一个类的对象也“是”另一个类的对象,如矩形是四边形,在C++中,矩形类Rectangle可以由四边形类Quad继承而来,于是,四边形类Quad是基类,矩形类Rectangle是派生类。但是如果说四边形一定是矩形显然不对。几个简单的基类和派生类的例子:
?
? ? ? ? ? ? 基类         ? ? ? ? ? ? ? ? ? ? ? ? 派生类
?
     ? 食物                 米饭、面条、水饺              
?
     ? 交通工具               汽车、火车、飞机
?
? ? ? ? ? ?国家                中国、美国、西班牙
?
?
?
可以看出,每个派生类的对象都是基类的一个对象,并且一个基类可以有很多派生类。继承关系构成一种树状层次结构。基类和派生类存在这种层次关系,如下图:
?
?
?
下面用程序实例来说明:
?
建立一个乒乓球会员的类TableTennisPlayer类:
?
复制代码
?1 #ifndef TABTEN_H_
?2 #define TABTEN_H_
?3 #include
?4 using std::string;
?5 //一个简单的基类
?6 class TableTennisPlayer
?7 {
?8 private:
?9 ? ? string firstname;
10 ? ? string lastname;
11 ? ? bool hasTable;
12 public:
13 ? ? TableTennisPlayer (const string & fn = "none",
14 ? ? ? ? ? ? ? ? ? ? const string & ln = "none", bool ht = false);
15 ? ? void Name() const;
16 ? ? bool HasTable() const {return hasTable;}
17 ? ? void ResetTable(bool v) {hasTable = v;}
18 };
19?
20 #endif
复制代码
复制代码
?1 #include
?2 #include "tabten.h"
?3?
?4 TableTennisPlayer::TableTennisPlayer (const string & fn,
?5 ? ? const string & ln, bool ht) : firstname(fn), lastname(ln),hasTable(ht) {}
?6?
?7 void TableTennisPlayer::Name() const
?8 {
?9 ? ? std::cout << lastname << ", " << firstname;
10 }
复制代码
TableTennisPlayer类只记录会员的姓名以及是否有桌球。假设一些会员参加过锦标赛,则需要这样一个类,它能包括会员在比赛中的比分。我们要重新新建一个类吗?显然不用,这时候只需从TableTennisPlayer类派生出一个类,假设为RatedPlayer
?
class RatedPlayer : public TableTennisPlayer
{
?...
};
?
冒号表示RatedPlayer类的基类是TableTennisPlayer类,public 表明TableTennisPlayer是一个公有基类,这被称为公有派生。
?
使用公有派生,基类的公有成员将成为派生类的公有成员;基类的私有部分也将成为派生类的一部分,但是只能通过基类的公有(public)和保护(protected)方法访问。
?
RatedPlayer对象将具有以下特征:
?
派生类对象存储了基类的数据成员(派生类继承了基类的实现)
派生类可以使用基类的方法(派生类继承了基类的接口)
派生类还需要做:
?
添加自己的构造函数
根据需要添加额外的数据成员和成员函数
添加派生类的头文件如下:
?
复制代码
1 #include
?2 #include "tabten.h"
?3?
?4 TableTennisPlayer::TableTennisPlayer (const string & fn,
?5 ? ? const string & ln, bool ht) : firstname(fn), lastname(ln),hasTable(ht) {}
?6?
?7 void TableTennisPlayer::Name() const
?8 {
?9 ? ? std::cout << lastname << ", " << firstname;
10 }
11?
12 class RatedPlayer : public TableTennisPlayer
13 {
14 private:
15 ? ? unsigned int rating; ? //添加数据成员
16 public:
17 ? ? //派生类的构造函数必须给新成员(如果添加了的话)和基类的成员提供数据
18 ? ? RatedPlayer (unsigned int r = 0, const string & fn = "none",
19 ? ? const string & ln = "none", bool ht = false);
20 ? ? RatedPlayer (unsigned int r, const TableTennisPlayer & tp);
21 ? ? unsigned int Rating() const {return rating;}//添加方法
22 ? ? void ResetRating (unsigned int r) {rating = r;}//添加方法
23 };
复制代码
复制代码
?1 #include
?2 #include "tabten.h"
?3?
?4 TableTennisPlayer::TableTennisPlayer (const string & fn,
?5 ? ? const string & ln, bool ht) : firstname(fn), lastname(ln),hasTable(ht) {}
?6?
?7 void TableTennisPlayer::Name() const
?8 {
?9 ? ? std::cout << lastname << ", " << firstname;
10 }
11?
12 RatedPlayer::RatedPlayer (unsigned int r, const string & fn,
13 ? ? const string & ln, bool ht) : TableTennisPlayer(fn, ln, ht)
14 {
15 ? ? rating = r;
16 }
17 RatedPlayer::RatedPlayer (unsigned int r, const TableTennisPlayer & tp)
18 ? ? : TableTennisPlayer(tp), rating(r){}
复制代码
派生类的构造函数必须给新成员(如果添加了的话)和基类的成员提供数据。派生类不能直接访问基类的私有成员,而必须通过基类方法访问,例如RatedPlayer构造函数不能直接设置继承的成员firstname, lastname和hasTable, 而必须使用基类的公有方法来访问私有的基类成员。
?
有关派生类构造函数的要点
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ZOJ3156_Taxi(二分图/二分构图) 下一篇Codeforces Round #261 (Div. 2) ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: