c++primer plus第十三章-类继承
1)类继承:能够从已有的类派生出新的类,而派生类继承了原有类(称为基类)的特征,包括方法。
可以在已有类的基础上添加功能。
可以给类添加数据。
可以修改类方法的行为。
2)使用公有派生:基类的公有成员将成为派生类的公有成员;基类的私有部分也将成为派生类的一部分,但是只能通过基类的公有和保护方法访问。
派生类对象存储了基类的数据成员(派生类继承了基类的实现)。
派生类对象可以使用基类的方法(派生类继承了基类的接口)。
派生类需要添加自己的构造函数。构造函数必须给新成员和继承的成员提供数据。
派生类可以根据需要添加额外的数据成员和成员函数。
class TableTennisPlayer
{
private:
string firstname;
string lastname;
bool hasTable;
public:
TableTenniePlayer(... ...);
};
class RatedPlayer : public TableTennisPlayer
{
private:
unsigned int rating;
public:
RatedPlayer(... ...);
};
3)创建派生类对象时,程序首先创建基类对象。这意味着基类对象应当在程序进入派生类构造函数之前被创建。c++使用成员初始化列表语法来完成这种工作。
RatedPlayer :: RatedPlayer(unsigned int r,const string &fn,
const string &In,bool ht) : TableTennisPlayer(fn,ln,ht)
{... ...}
4)必须首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数。除非要使用默认构造函数,否则应显式调用正确的基类构造函数。
5)也可以对派生类成员使用成员初始化列表语法,这个时候,应该在列表中使用成员名,而不是类名。
RatedPlayer :: RatedPlayer(unsigned int r,const TableTennisPlayer & tp) : TableTennisPlayer(tp), rating(r)
{... ...}
6)创建派生类构造函数的要到如下:
首先,创建基类对象。
其次,派生类构造函数应该通过成员初始化列表将基类信息传递给基类构造函数;
最后,派生类构造函数初始化派生类新增的数据成员。
7)注意:创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数。基类构造函数负责初始化继承的数据成员;派生类构造函数主要用于初始化新增的数据成员。派生类的构造函数总是调用一个基类构造函数。可以使用初始化器列表语法指明要使用的基类构造函数,否则将使用默认的基类构造函数。
派生类对象过期时,程序将首先调用派生类析构函数,然后再调用基类析构函数。也就是说,释放对象的顺序与创建对象的顺序相反。
8)派生类与基类之间的特殊关系:基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。然而,基类指针或引用只能用于调用基类方法。
RatedPlayer rplayer1(......);//派生类对象
TableTennisPlayer &rt = rplayer;//基类引用 引用派生类对象
TableTennisPlayer *pt = &rpalyer;//基类指针 指向派生类对象
rt.Name();
pt->Name();
9)不可以将基类对象和地址赋给派生类引用和指针
TableTennisPlayer player(......);//派生类对象
RatedPlayer & rr = player;//非法
RatedPlayer * pr = player;//非法