#include
using namespace std;
//基類
class baseDMA
{
private:
char* label;
int rating;
public:
baseDMA(const char* l=“NULL”,int r=0); //預設構造函數
baseDMA(const baseDMA& rs); //拷貝構造函數
virtual ~baseDMA(); //虛析構
baseDMA & operator=(const baseDMA& rs); //指派構造函數
friend ostream & operator<<(ostream& os,const baseDMA& rs); //友元
};
//派生類 沒有動态記憶體配置設定
class lackDMA : public baseDMA
{
private:
enum{COL_LEN=40};
char color[COL_LEN];
public:
lackDMA(const char* c=“blank”,const char* l=“null”,int r=0);
lackDMA(const char*c,const baseDMA& rs);
friend ostream & operator<<(ostream& os,const lackDMA& rs);
};
//派生類 有動态記憶體配置設定
class hasDMA : public baseDMA
{
private:
char style;
public:
hasDMA(const char s=“none”,const char* l=“null”,int r=0);
hasDMA(const char* s,const baseDMA& rs);
hasDMA(const hasDMA& hs);
~hasDMA();
hasDMA & operator=(const hasDMA & rs);
friend ostream & operator<<(ostream& os,const hasDMA & rs);
};
#include “45.h”
#include
//類成員變量是動态記憶體配置設定 使用new動态配置設定
baseDMA::baseDMA(const char* l, int r)
{
label = new char[strlen(l)+1];
strcpy(label, l);
rating = r;
}
baseDMA::baseDMA(const baseDMA& rs)
{
label = new char[strlen(rs.label)+1];
strcpy(label, rs.label);
rating = rs.rating;
}
//析構函數 釋放new出來的記憶體
baseDMA::~baseDMA()
{
delete[] label;
}
//指派運算符
baseDMA & baseDMA::operator=(const baseDMA& rs)
{
if (this == &rs)
{
return *this;
}
delete[] label; //将原來類配置設定的記憶體空間釋放掉
label = new char[strlen(rs.label)+1];
strcpy(label, rs.label);
rating = rs.rating;
return *this;
}
//輸出運算符 就是将内容存儲到ostream的變量os中
ostream& operator<<(ostream& os, const baseDMA& rs)
{
os << “Label:” << rs.label << endl;
os << “Rating:” << rs.rating << endl;
return os;
}
//
//lackDMA派生類 疑問,這種情況下一定要初始化基類嗎 如果是沒有的參數的預設構造函數的情況呢
//回答:基類的構造函數是有參的,派生類的構造函數需要對基類進行初始化
//這裡使用成員初始化清單
lackDMA::lackDMA(const char* c, const char* l, int r)
:baseDMA(l, r)
{
strncpy(color, c,COL_LEN-1);
color[COL_LEN-1] = ‘\0’; //字元串最後一個字元一定是結束符
}
lackDMA::lackDMA(const char*c, const baseDMA& rs) //參數裡有拷貝構造函數
: baseDMA(rs)
{
strncpy(color, c, COL_LEN - 1);
color[COL_LEN-1] = ‘\0’;
}
ostream & operator<<(ostream& os, const lackDMA& rs)
{
os << (const baseDMA&)rs; //派生類調用基類友元 使用強轉
os << “color:” << rs.color << endl;
return os;
}
//
hasDMA::hasDMA(const char* s, const char* l, int r)
:baseDMA(l,r)
{
style = new char[strlen(s)+1];
strcpy(style, s);
}
hasDMA::hasDMA(const char* s, const baseDMA& rs)
:baseDMA(rs)
{
style = new char[strlen(s)+1];
strcpy(style, s);
}
hasDMA::hasDMA(const hasDMA& hs)
:baseDMA(hs) //注意一下這邊 調用基類預設構造函數
{
style = new char[strlen(hs.style)+1];
strcpy(style, hs.style);
}
hasDMA::~hasDMA()
{
delete[] style;
}
hasDMA & hasDMA::operator=(const hasDMA & rs)
{
if (this == &rs)
{
return *this;
}
baseDMA::operator=(rs); //使用作用域解析符 調用基類指派函數
delete[] style;
style = new char[strlen(rs.style)+1];
strcpy(style, rs.style);
return *this;
}
ostream & operator<<(ostream& os, const hasDMA & rs)
{
os << (const baseDMA&)rs; //強制類型轉換(const baseDMA&)rs
os << “style” << rs.style << endl;
}