C++ Primer Plus 13章 类继承(1)
程序员文章站
2023-12-22 23:10:16
...
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;
}