C++PrimerPlus:第十三章类和继承:一个简单的基类13.1-3

一个简单的基类

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。为说明继承,首先需要一个基类。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构造函数。

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值