一般来说一个类可以继承于另外一个类,分别叫做派生类和基类,
派生类继承了基类的公有成员和保护成员以及实现,而私有成员只能通过
基类的公有方法进行访问
派生类应该包含如下信息:
1、继承类构造函数
2、需要额外增加的成员以及实现
我们引用C++ primer plus中的例子,当然这些例子我都是手动打过一遍的
<lastname<<", "<<firstname;="" }="" rateplayer::rateplayer(unsigned="" int="" r,const="" string="" &fn,const="" &ln,bool="" ht):tabletennisplayer(fn,ln,ht),rating(r){} <player3.rating();=""
-
#ifndef TABTEEN_H_
-
#define TABTEEN_H_
-
#include<iostream>
-
using namespace std;
-
-
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;
-
bool HasTable() const
-
{return hasTable;};
-
void ResetTable(bool v)
-
{hasTable = v;};
-
};
-
-
class RatePlayer:public TableTennisPlayer
-
{
-
private:
-
unsigned int rating;
-
public:
-
RatePlayer(unsigned int r=0,const string & fn="none",const string& ln="none",bool ht=false);
-
RatePlayer(unsigned int r,const TableTennisPlayer& tp);
-
unsigned int Rating() const
-
{return rating;}
-
void ResetRaing(unsigned int r)
-
{rating = r;}
-
};
-
-
#endif
-
-
TableTennisPlayer::TableTennisPlayer (const string& fn,const string &ln,bool ht):firstname(fn),lastname(ln),hasTable(ht){}
-
void TableTennisPlayer::Name() const
-
{
-
std::cout<<lastname<<", "<<firstname;
-
}
-
RatePlayer::RatePlayer(unsigned int r,const string &fn,const string &ln,bool ht):TableTennisPlayer(fn,ln,ht),rating(r){}
-
//这里注意必须使用初始化列表的方式进行基类的初始化及TableTennisPlayer(fn,ln,ht)是必须的当然这里rating(r)不是必须的
-
RatePlayer::RatePlayer(unsigned int r,const TableTennisPlayer& tp):TableTennisPlayer(tp),rating(r){}
-
//这里注意TableTennisPlayer(tp)调用了默认的复制构造函数,每个类都包含一个默认的复制构造函数
-
-
主函数
-
-
#include<iostream>
-
#include "tabtenn0.h"
-
using namespace std;
-
-
int main(void)
-
{
-
TableTennisPlayer player1("Chuck","Blizzard",true);
-
TableTennisPlayer player2("Tara","Boomdea",true);
-
RatePlayer player3(1111,"gaopeng","Yjf",false);
-
player1.Name();
-
if(player1.HasTable())
-
cout<<": has a table.\n";
-
else
-
cout<<": hasn't a table.\n";
-
player2.Name();
-
if(player2.HasTable())
-
cout<<": has a table\n";
-
else
-
cout<<": hasn't a table.\n";
-
-
player3.Name();//TableTennisPlayer.Name()
-
cout<<" sorce: "<<player3.Rating();
-
if(player3.HasTable())
-
cout<<": has a table\n";
-
else
-
cout<<": hasn't a table.\n";
-
-
return 0;
-
}
这里player3对象的类是RatePlayer基类是TableTennisPlayer,Name和HasTable方法都是TableTennisPlayer继承而来,
而Rating是在继承类RatePlayer中定义的
注意点:
1、RatedPlayer::RatedPlayer(unsigned int r,const string &fn,const string &ln,bool ht):TableTennisPlayer(fn,ln,ht),rating(r){}
这里注意必须使用初始化列表的方式进行基类的初始化及TableTennisPlayer(fn,ln,ht)是必须的当然这里rating(r)不是必须的
可以{rating = r;}声明
下面的类型必须使用初始化列表的方式进行初始化
当使用如下方式的时候需要使用构造函数列表初始化成员
1、const 成员
2、引用&成员
3、继承类的基类初始化
4、本生就是类的成员
详细见
http://blog.itpub.net/7728585/viewspace-2122388/ 第8部分
2、RatePlayer(unsigned int r,const TableTennisPlayer& tp):TableTennisPlayer(tp),rating(r){}
这里注意TableTennisPlayer(tp)调用了默认的复制构造函数,每个类都包含一个默认的复制构造函数,
在使用new等动态分配的时候显示定义深度复制构造函数是必须的,但是这里默认即可
详细见
http://blog.itpub.net/7728585/viewspace-2121213/ 第2部分深度复制
3、RatedPlayer::RatedPlayer(unsigned int r,const string &fn,const string &ln,bool ht):rating(r){}
注意这里没有调用构造函数,编译器将对基类使用默认的构造函数,也就是什么都不做,但是这样显然没有意义
在这里。
详细见
http://blog.itpub.net/7728585/viewspace-2120608/
下面是派生类构造函数相关要点
1、派生类构造函数需要调用基类构造函数初始化基类,并且在初始化列表中
2、派生类构造函数应该初始化新增的数据成员
3、派生类构造函数在初始化前就需要初始化基类,所以必须在初始化列表中
另外在析构函数中,程序会先调用派生类析构函数然后调用基类析构函数
其次,注意当基类的指针或者引用对象可以指向继承类的对象,因为继承类中一定包含了基类有的全部的信息,
但是反过来继承类的指针或者引用不你能指向基类的对象,因为基类并不包含继承类的全部信息,比如RatePlayer
中的rating在基类TableTennisPlayer中是不存在的,所以如下是成立的
同样我们知道默认的复制构造函数定义为
TableTennisPlayer(TableTennisPlayer& in)
但是由于TableTennisPlayer& 可以指向 RatePlayer&
所以TableTennisPlayer(RatePlayer& in)是成立的
也就是说
RatePlayer player3(1111,"gaopeng","Yjf",false);
TableTennisPlayer p3(player3);
成立
详细见
http://blog.itpub.net/7728585/viewspace-2121213/ 第2部分深度复制
同时
RatePlayer player3(1111,"gaopeng","Yjf",false);
TableTennisPlayer p4;
p4=player3;
也是成立的
调用默认的等值复制函数
原型
TableTennisPlayer& operator=(const TableTennisPlayer& st)
由于TableTennisPlayer&可以指向 RatePlayer&
所以TableTennisPlayer& operator=(const RatePlayer& st)
详细见:
http://blog.itpub.net/7728585/viewspace-2122388/ 第二部分
我们可以试一下,在原有的代码中加入:
<endl;
<endl;
-
TableTennisPlayer p1(player3);
-
TableTennisPlayer p2;
-
p2=player3;
-
p1.Name();
-
cout<<endl;
-
p2.Name();
-
cout<<endl;
-
return 0;
</endl;
输出为:
Yjf, gaopeng
Yjf, gaopeng
没有问题
</endl;
</lastname<
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7728585/viewspace-2123224/
,如需转载,请注明出处,否则将追究法律责任。