if (this -- shs)
return *this;
baseDMA :: operator=(hs); // copy base portion
style = new char[std :: strlen(hs.style) + 1];
std :: strcpy(style, hs.style);
return *this;
1
std :: ostream & operator << {std :: ostream & os, const hasDMA & hs)
os << (const baseDMA &) hs;
os << "Style: " << hs.style << std :: endl;
return os;
在程序清单13.13和13.14中,需要注意的新特性是,派生类如何使用基类的友元。例如,请考虑下面
这个hasDMa类的友元:
friend std :: ostream & operator << (std :: ostream & os, const hasDMA & rs) :
作为hasDMA类的友元,该函数能够访问style成员。但是,还存在一个问题:该函数如不是baseDMA
类的友元,那它如何访问成员lable和rating呢?答案是使用 baseDMA 类的友元函数 operator << ()。下一
个问题是,因为友元不是成员函数,所以不能使用作用域解析操作符来指出要使用哪个函数。这个问题的
解决方法是使用强制类型转换,以便匹配原型时能够选择正确的函数。因此,代码将参数const hasDMA&
转换成类型为 const baseDMA &的参数:
std :: ostream & operator << (std :: ostream & os, const hasDMA & hs)
// typecast to match operator << (ostream &. const baseDMA &)
os << (const baseDMA &) hs:
os << "Style: " << hs.style << endl:
return os:
程序清单13.15是一个测试类bascDMA、lackDMA和hasDMA的小程序。
程序清单 13.15 usedma.cpp
// usedma.cpp -- inheritance, friends, and DMA
// compile with dma.cpp
finclude <iostream>
#include "dma.h"
int main()
using std :: cout;
using std :: endl;
baseDMA shirt ("Portabelly", 8);
lacksDMA balloon ("red", "Blimpo", 4);
hasDMA map ("Mercator", "Buffalo Keys", 5);
cout << shirt << endl:
cout << balloon << endl:
cout << map << endl;
lacksDMA balloon2 (balloon):
hasDMA map2:
map2 - map:
cout << balloon2 << endl:
cout << map2 << endl;
return 0:
程序清单13.13~13.15组成的程序的输出如下:
Label: Portabelly