C++ Primer Plus 13章 类继承(1)

C++ Primer Plus 13章 类继承(1)

从已有的类中派生出新的类,而新的类继承了原有类的特征,包括方法。

继承分为三种:公有继承,私有继承,保护继承

这里暂时只介绍公有继承:public

看一个书上的实际例子:给一个基类

class TableTennisPlayer
{
private:
    string firstname;
    string lastname;
    bool hasTable;
public:
    TableTennisPlayer(const string & fn = "none",
                     const string & ln = "none",
                     bool ht = false);
    void Name() const;
    bll HasTable const{return hasTable;};
    void ReserTable(bool v){hasTable = v;};
    
}

//其实现方法,主要是构造函数
//方式一:采用初始化成员列表

TableTennisPlayer::TableTennisPlayer (const string &fn,
const string &ln, bool ht):firstname(fn),lastname(ln),hasTable(ht){}

//方式二:函数写法

TableTennisPlayer::TableTennisPlayer (const string &fn,const string &ln, bool ht)
{
	firstname = fn;
	lastname = ln;
	hasTable = ht;
}

然后派生一个类

class RatedPlayer:public TableTennisPlayer
{
private:
    unsigned int rating;
public:
    RatedPlayer(unsigned int r = 0,const string &fn = "none",const string & ln = "none",bool ht = false);
    RatedPlayer(unsigned int r,const TableTennisPlayer & tp);
}

//方法实现

RatedPlayer::RatedPlayer(unsigned int r, const string & fn, const string & ln,bool ht):TableTennisPlayer(fn,ln,ht)
{
    rating = r;
}

下面对继承的一些方面进行说明,也是对书上的内容总结:

构造函数的访问权限

(1)派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问

(2)创建派生类对象时,程序首先创建基类对象,这是从逻辑上来说,意思就是我们在创建派生类对象的时候,构造函数必须对基类的成员进行初始化,也就是要调用基类的构造函数进行初始化,然后再调用派生类的构造函数进行初始化。而这一步我们可以在派生类的构造函数实现中,使用初始化成员列表的方式,如上述代码。

派生类和基类的特殊关系

(1)派生类对象可以使用基类的非私有方法

(2)基类指针或者引用,可以在不进行显示类型转换的情况下引用派生类对象;

​ 但是基类指针或者引用只能用于调用基类方法,不能调用派生类方法;

​ 同时,不能将基类对象和地址赋值给派生类引用和指针;

多态公有继承

实现方法:

(1)在派生类中重新定义基类的方法

(2)使用虚方法,程序会自动识别到使用基类还是派生类的方法

给出一个基类:

class Brass
{
private:
    string fullName;
    long acctNum;
    double balance;
public:
    Brass(const string & s="Nullbody", long an = -1,double bal = 0.0);
    void Deposir(double amt);
     double Balance() const;
    
    //下面这是虚方法定义
    virtual void Withdraw(double amt);
    virtual void ViewAcct() const;
    virtual ~Brass();
}

然后给出一个派生类

class BrassPlus:public Brass
{
private:
    double maxLoan;
    double rate;
    double owesBank;
public:
    BrassPlus(const string & s = "Nullbody", long an = -1,double bal = 0.0,double ml = 500,double r = 0.11125);
    BrassPlus(const Brass & ba, double ml = 500, double r = 0.11125);
    
    //下面这两个就是对应于基类的虚方法,
    virtual void ViewAcct() const;//
    virtual void Withdraw(double amt);//
    
    
    void ResetMax(double m){maxLoan = m;}
    void ResetRate(double r){rate = r;}
    void ResetOwes(){owesBank = 0;}
}

给一个虚方法实现多态的例子;

Brass * p_clients[4];
//这是定义的一个基类指针数组,根据前面的说法就是既可以指向Brass基类对象,也能指向派生类BrassPlus对象

for(int i=0;i<4;i++)
{
    p_clients[i]->ViewAcct();
    //在这里程序将会根据数组里到底是基类对象还是派生类对象,去调用对应的ViewAcct()方法,这就是多态的体现,同一个函数名称,在不用的对象中,实现了同样的方法
    cout<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值