天天看點

關于繼承和動态記憶體配置設定

#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;

}

繼續閱讀