C++派生類與基類的關系


派生類與基類有這些關系:

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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM