@cxm-2016
2016-09-27T04:56:47.000000Z
字数 2844
阅读 2167
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]
