基类声明的函数引用参数或指针参数可用于值为基类对象或派生类对象以及它们的地址的情况。
void Show(const TableTennisPlayer &rt)
{
...
}
TableTennisPlayer player1("Tara", "Boomdea", false);
RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
Show(player1); // works with TableTennisPlayer argument
Show(rplayer1); // works with RatedPlayer argument
省略形参为const TableTennisPlayer *rt的情况,与上相似。
引用兼容性属性:可以将基类对象初始化为派生类对象。
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer olaf2(olaf1);
匹配的构造函数的原型:
TableTennisPlayer(const RatedPlayer &); // doesn't exit
类中并没有该构造函数,但存在隐式复制构造函数:
// implicit copy constructor TableTennisPlayer(const TableTennisPlayer &);
即它将olaf2初始化为嵌套在RatedPlayer对象olaf1中的TableTennisPlayer对象(使用派生类中嵌套的基类对象对目标基类对象进行初始化)
同样,也可以将派生对象赋给基类对象:
RatedPlayer olaf1(1840, "Olaf", "Loaf", true); TableTennisPlayer winner; winner = olaf1; // assign derived to base object
在这种情况下,程序使用隐式重载赋值运算符:
TableTennisPlayer &operator=(const TableTennisPlayer &) const;
与上类似,使用派生类中嵌套的基类对象对目标基类对象进行按成员赋值。
特殊的用基类对象给派生类对象赋值的情况
如果派生类包含了将基类对象转换为派生类对象的构造函数,或派生类定义了将基类对象赋给派生类对象的赋值运算符,则可以用派生类对象给基类对象赋值。
用已有的派生类对象初始化创建的派生类对象
复制类成员或继承的类组件时,则是使用该类的复制构造函数完成的,对于继承的基类对象来说也是合适的。
用已有的派生类对象给另一个派生类对象赋值
按成员赋值,调用类成员赋值运算符,使用基类的赋值运算符来对基类组件(继承的基类对象)进行赋值
若派生类使用了动态内存分配,派生类的析构函数、复制构造函数、复制运算符都必须使用相应的基类方法来处理基类元素(显示调用基类构造函数和复制运算符):










