一个简单的基类
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。为说明继承,首先需要一个基类。Webtown 俱乐部决定跟踪乒乓球会会员。作为俱乐部的首席程序员,需要设计一个简单的 TableTennisPlayer类,如程序清单 13.1和 13.2 所示。
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序清单13.1 tabtenno.h
// tabtenn0.h -- a table-tennis base class
#ifndef TABTENN0_H_
#define TABTENN0_H_
#include <string>
using std::string;
// simple base class
class TableTennisPlayer
{
private:
string firstname;
string lastname;
bool hasTable;
public:
TableTennisPlayer (const string & fn = "none",
const string & ln = "none", bool ht = false);
void Name() const;
bool HasTable() const { return hasTable; };
void ResetTable(bool v) { hasTable = v; };
};
#endif
从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。为说明继承,首先需要一个基类。Webtown 俱乐部决定跟踪乒乓球会会员。作为俱乐部的首席程序员,需要设计一个简单的 TableTennisPlayer类,如程序清单 13.1和 13.2 所示。
二、程序清单13.2 tabtenn0.cpp
//tabtenn1.cpp -- simple base-class methods
#include "tabtenn1.h"
#include <iostream>
TableTennisPlayer::TableTennisPlayer (const string & fn,
const string & ln, bool ht) : firstname(fn),
lastname(ln), hasTable(ht) {}
void TableTennisPlayer::Name() const
{
std::cout << lastname << ", " << firstname;
}
// RatedPlayer methods
RatedPlayer::RatedPlayer(unsigned int r, const string & fn,
const string & ln, bool ht) : TableTennisPlayer(fn, ln, ht)
{
rating = r;
}
RatedPlayer::RatedPlayer(unsigned int r, const TableTennisPlayer & tp)
: TableTennisPlayer(tp), rating(r)
{
}
TableTennisPlayer 类只是记录会员的姓名以及是否有球桌。有两点需要说明。首先,这个类使用标准 string 类来存储姓名,相比于使用字符数组,这更方便、更灵活、更安全,而与第12章的 String类相比,这更专业。其次,构造函数使用了第12章介绍的成员初始化列表语法,但也可以像下面这样做:
TableTennisPlayer::TableTennisPlayer(const string &fn,
const string &ln,bool ht)
{
firstname = fn;
lastname =ln;
hasTable =ht;
}
这将首先为 firstname 调用 string 的默认构造函数,再调用 string的赋值运算符将 firstname 设置为 fn,但初始化列表语法可减少一个步骤,它直接使用 string的复制构造函数将 firstname 初始化为 。程序清单13.3使用了这个类。
二、程序清单13.3 usett0.cpp
// usett0.cpp -- using a base class
#include <iostream>
#include "tabtenn0.h"
int main ( void )
{
using std::cout;
TableTennisPlayer player1("Chuck", "Blizzard", true);
TableTennisPlayer player2("Tara", "Boomdea", false);
player1.Name();
if (player1.HasTable())
cout << ": has a table.\n";
else
cout << ": hasn't a table.\n";
player2.Name();
if (player2.HasTable())
cout << ": has a table";
else
cout << ": hasn't a table.\n";
// std::cin.get();
return 0;
}
总结
提示:这里对文章进行总结:
下面是程序清单 13.1.-13.3 组成的程序的输出:
Blizzard,Chuck:has atable.
Boomdea,Tara:hasn'tatable
注意到该程序实例化对象时将C-风格字符串作为参数:
TableTennisPlayer playerl("Chuck","Blizzard",true);
TableTennisPlayer player2("Tara","Boomdea",false):
提示:
但构造函数的形参类型被声明为 const string&。这导致类型不匹配,但与第12章创建的 String 类一样,string类有一个将 const char作为参数的构造函数,使用C-风格字符串初始化string对象时,将自动调用这个构造函数。总之,可将string对象或C-风格字符串作为构造函数TableTennisPlayer 的参数;将前者作为参数时,将调用接受 const string&作为参数的string 构造函数,而将后者作为参数时,将调用接受 const char 作为参数的 string构造函数。