1. 派生类可以使用基类方法(非private)
2. 基类指针可以不显式类型转换情况下指向派生类对象, 基类引用可以在不进行显示类型转换的情况下引用派生类对象.
RatedPalyer rplayer(1111,"Mallory","duck",true);
TableTennisPlayer &rt = rplayer;
TableTennisPlayer * pt = &rplayer;
rt.Name() ; // invoke Name() with reference
pt->Name(); //invoke Name() with pointer
只能调用基类方法,不能调用派生类方法.
3. 不可以将基类对象和地址赋给派生类引用和指针
TableTennisPalyer player("betsy","bloop",true);
RatedPalyer &rr = player; // Not allowed
RatedPalyer *pr = player; //Not allowed
4 .基类指针指向派生类对象 //此处为关键部分
void Show(const TableTennisPlayer &rt)
{
cout<<"Name:";
rt.Name();
cout<<"\nTable";
if(rt.HasTable())
cout<<"yes\n";
else
cout<<"no\n";
}
形参rt为基类引用,可以指向基类对象或派生类对象,所以可以使用TableTennis 或RatedPlayer
TableTennisPlayer player1("Tara","Boomdea",false);
RatedPlayer rplayer1(1111,"Mallory","Duck",true);
Show(player1);
Show(rplayer1):
对于形参指向基类的指针的函数,也存在此关系,它可以使用基类对象的地址或派生类对象的地址作为实参。
void Wohs(const TableTennisPlayer *pt) ;//function with pointer parameter
RatedPalyer rplayer(1111,"Mallory","Duck",true);
Wohs(&rplayer);
引用兼容性属性也能够将基类对象初始化为派生类对象
RatedPlayer olaf1(1111,"Olaf","loaf",true);
TableTennisPlayer olaf2(olaf1);
要初始化olaf2 , 匹配的构造函数如下:
TableTennisPlayer( const RatedPlayer &);
类定义中没有这样的构造函数,但存在隐式复制构造函数
TableTennisPlayer(const TableTennisPlayer &);
形参是基类引用,它可以引用派生类对象。
--------------------------------------------------------
可以将派生类对象赋予基类对象
RatedPlayer olaf1(1111,"olaf","loaf",true);
TableTennisPlayer winner;
winner = olaf1; //assign derived to base object
在这情况下,程序使用隐式重载赋值操作符:
TableTennisPlayer & operator=(const TableTennisPlayer &) const;
基类引用的也是派生类对象。