-
// doesn't exist
13.3
赋给派生类引用,将发生什么情况呢?派生类引用能够为基对象调用派生类方法,这样做将出现问题。例
如,将RatedPlayer :: Rating()方法用于TableTennisPlayer对象是没有意义的,因为TableTennisPlayer对象没
有rating成员。
如果基类引用和指针可以指向派生类对象,将出现一些很有趣的结果。其中之一是基类引用定义的函
数或指针参数可用于基类对象或派生类对象。例如,在下面的函数中:
void Show (const TableTennisPlayer & rt)
cout << "Name: ":
rt.Name():
cout << "\nTable: ";
if (rt. HasTable () )
Cout << "yes\n":
else
cout << "no\n":
形参rt是·个基类引用,它可以指向基类对象或派生类对象,所以可以在Show()中使用 TableTennis
参数或Ratedplayer 参数:
TableTennisPlayer playerl |"Tara". "Boomdea", false) :
RatedPlayer rplayer1 (1140. "Mallory". "Duck", true) :
Show (player1) : // works with TableTennisPlayer argument
Show |rplayerl) : // works with RatedPlayer argument
对于形参为指向基类的指针的函数,也存在相似的关系。它可以使用基类对象的地址或派生类对象的
地址作为实参:
void Wohs (const TableTennisPlayer * pt); // function with pointer parameter
TableTennisPlayer playerl("Tara", "Boomdea", false);
RatedPlayer rplayer1 (1140, "Mallory", "Duck", true) ;
Wohs (6playerl); // works with TableTennisPlayer * argument
Wohs (&rplayer1); // works with RatedPlayer * argument
引用兼容性属性也能够将基类对象初始化为派生类对象,尽管不那么直接。假设有这样的代码:
RatedPlayer olafl (1840. "Olaf", "Loaf", true) ;
TableTennisPlayer olaf2 lolafl) ;
要初始化olaf2,匹配的构造函数的原型如下:
TableTennisPlayer (const RatedPlayer &) :
类定义中没有这样的构造函数,但存在隐式复制构造函数:
// implicit copy constructor
TableTennisPlayer (const TableTennisPlayer &) :
形参是基类引用,因此它可以引用派生类。这样,将olaf2初始化为olafl时,将要使用该构造函数,
它复制firstname、lastname 和hasTable 成员。换句话来说,它将olaf2初始化为嵌套在RatedPlayer对象olaf1
中的TableTennisPlayer 对象。
同样,也可以将派生对象赋给基类对象:
RatedPlayer olafl (1840. "Olaf", "Loaf", true) :
TableTennisPlayer winner:
winner = olafl: // assign derived to base object
在这种情况下,程序将使用隐式重载赋值操作符:
TableTennisPlayer & operator= (const TableTennisPlayer &) const:
基类引用指向的也是派生类对象,因此olafl的基类部分被复制给winner。
继承-is-a关系
派生类和基类之间的特殊关系是基于C++继承的底层模型的。实际上,C++有3种继承方式:公有继