@cxm-2016
2016-09-27T12:56:47.000000Z
字数 2844
阅读 1825
c++
编号:01010103011160907002
作者:陈小默
更新信息:1,修改了部分错别字。2,修改引用的显示方式
从一个类派生出另外一个类的时候,原始类被称为基类,继承类被称为派生类。为说明继承关系,首先需要定义一个基类。以下定义一个乒乓球会会员。
#ifndef primer_table_tennis_player_h
#define primer_table_tennis_player_h
#include<string>
#include<iostream>
using std::cout;
using std::endl;
using std::string;
class TableTennisPlayer{
private:
string _name;
bool _hasTable;
public:
TableTennisPlayer(const string & name="anon",bool hasTable=false);
void name() const;
bool hasTable() const{return _hasTable;};
void resetTable(bool hasTable){_hasTable=hasTable;};
};
TableTennisPlayer::TableTennisPlayer(const string & name,bool hasTable):_name(name),_hasTable(hasTable){}
void TableTennisPlayer::name()const{
cout<<_name<<" : "<<endl;
}
#endif
这里测试一下
#include"stdafx.h"
#include"table_tennis_player.h"
int main(int argc, const char * argv[]) {
TableTennisPlayer jack("Jack",false),sam("Sam",true);
jack.name();
cout<<(jack.hasTable()?"has a table":"hasn't a table")<<endl;
sam.name();
cout<<(sam.hasTable()?"has a table":"hasn't a table")<<endl;
return 0;
}
运行结果
Jack :
hasn't a table
Sam :
has a table
现在需要这样一个类,它能够包含成员在比赛中的比分。现在将要从原有的TableTennisPlayer派生出一个类。
class RatedPlayer : public TableTennisPlayer {...};
冒号支出RatedPlayer类的基类是TableTennisPlayer类。public表明了这是一个公有基类,这个类被称为公有派生类。使用公有派生,基类的公有成员将会称为派生类的公有成员;基类的私有成员也是派生类的一部分,但是派生类不能直接访问。
派生类不能访问基类的私有成员,而必须通过基类公有方法进行访问。具体的说,派生类的构造函数必须使用基类的构造函数。创建派生类时,程序首先创造基类对象。从概念上讲,这意味着基类对象应当在程序进入派生类的构造函数之前被创建。下面是一个构造函数的代码:
RatedPlayer::RatedPlayer(unsigned rating,const string name,bool hasTable):TableTennisPlayer(name,hasTable){
_rating = rating;
}
如果我们没有使用冒号显式的调用基类的构造方法,函数将调用基类默认的构造方法,也就是说在没有显式调用基类构造方法的情况下,基类必须提供一个默认的构造函数。
有关派生类构造函数:
注意:派生类创建对象的时候,程序首先调用基类的构造函数,然后再调用派生类的构造函数。基类构造函数负责初始化继承的数据成员;派生类的构造函数用于初始化新增的数据成员。派生类对象过期时,程序首先调用派生类的析构函数,然后再调用基类的析构函数。
#ifndef primer_rated_player_h
#define primer_rated_player_h
#include"table_tennis_player.h"
class RatedPlayer : public TableTennisPlayer{
private:
unsigned _rating;
public:
RatedPlayer(unsigned rating = 0,const string & name = "anon",bool hasTable = false);
RatedPlayer(unsigned rating,const TableTennisPlayer &player);
unsigned rating() const {return _rating;};
void resetRating(unsigned rating){_rating=rating;};
};
RatedPlayer::RatedPlayer(unsigned rating,const string & name,bool hasTable):TableTennisPlayer(name,hasTable),_rating(rating){}
RatedPlayer::RatedPlayer(unsigned rating,const TableTennisPlayer &player):TableTennisPlayer(player),_rating(rating){}
#endif
测试运行
#include"stdafx.h"
#include"rated_player.h"
int main(int argc, const char * argv[]) {
TableTennisPlayer jack("Jack",true);
RatedPlayer p_jack(12,jack);
p_jack.name();
cout<<"rating is "<<p_jack.rating()<<endl;
return 0;
}
运行结果
Jack :
rating is 12
派生类可以使用基类中非私有的方法。并且其多态属性导致基类指针可以指向派生类对象;但是派生类指针不能自动指向基类对象。[1]