派生類與基類有這些關系:
1.公有派生類從基類繼承所有成員和成員函數
2.公有派生類無法直接訪問從基類繼承的私有成員,但可以通過繼承的公共接口訪問。
3.公有派生類無法繼承基類的友元函數。
4.基類先於派生類被創建,派生類先於基類被析構。
5.派生類的構造函數使用初始化列表來初始化它的成員。兩種方式:使用基類的默認構造函數;顯式調用基類的構造函數。如果初始化列表什么都不寫,則默認使用前者。
類聲明:
//Class.h -- Declaration of class #ifndef _CLASS_H_ #define _CLASS_H_ #include <string> using std::string; class Player { public: enum career{WARRIOR,WIZARD,ASSASSIN}; enum sex{MALE,FEMALE,UNKNOWN}; private: string player_name; sex player_sex; unsigned int player_level; career player_career; public: Player(const string pn = "none",sex ps = MALE,unsigned int pl = 1,career pc = WARRIOR); ~Player(); string get_career(); sex get_sex(){return player_sex;}; string get_name(){return player_name;}; friend void welcome(const Player & pr); }; //Derived from class Player class RankedPlayer:Player { private: unsigned int ranking; public: RankedPlayer(const string pn = "none",sex ps = MALE,unsigned int pl = 1,career pc = WARRIOR,unsigned int r = 999); unsigned int get_rank(){return ranking;}; void show_rank(); }; #endif // _CLASS_H_
類定義:
//ClassDefine.cpp -- Definition of class #include "Class.h" #include <iostream> //Methods for class Player Player::Player(const string pn,sex ps,unsigned int pl,career pc):player_name(pn),player_sex(ps),player_level(pl),player_career(pc) { std::cout<<"New player joined in.\n"; } Player::~Player() { std::cout<<"Player "<<get_name()<<" has quited.\n"; } string Player::get_career() { string c; switch(player_career) { case WARRIOR:{c = "warrior";break;} case WIZARD:{c = "wizard";break;} case ASSASSIN:{c = "assassin";break;} default:{break;} } return c; } void welcome(const Player & pr) { if(pr.player_sex == Player::MALE) { std::cout<<"Welcome "<<pr.player_name<<", his career is "<<pr.player_career<<".\n"; } else if(pr.player_sex == Player::FEMALE) { std::cout<<"Welcome "<<pr.player_name<<", her career is "<<pr.player_career<<".\n"; } else { std::cout<<"Welcome "<<pr.player_name<<".\n"; } } //Methods for class RankedPlayer RankedPlayer::RankedPlayer(const string pn,sex ps,unsigned int pl,career pc,unsigned int r):Player(pn,ps,pl,pc) { ranking = r; } void RankedPlayer::show_rank() { std::cout<<get_name()<<"("<<get_career()<<")"<<"'s ranking is: "<<ranking<<"\n"; }
類使用:
//Use Class #include "Class.h" int main(void) { Player p1; welcome(p1); Player p2("Joseph",Player::UNKNOWN,99); welcome(p2); RankedPlayer p3("Jotaro",Player::MALE,99,Player::WIZARD,1); //welcome(p3); p3.show_rank(); return 0; }