C++ 继承 使用动态内存分配及友元的继承
#ifndef PRO1_DMA_H#define PRO1_DMA_H#include <iostream>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 lacksDMA:public baseDMA{private:    enum {COL_LEN = 40};    char color[COL_LEN];public:    lacksDMA(const char * c = "blank", const char * l = "null", int r = 0);    lacksDMA(const char * c, const baseDMA & rs);    friend ostream&operator<<(ostream & os, const lacksDMA & 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 &operator=(const hasDMA &rs);    ~hasDMA();    friend ostream &operator<<(ostream & os, const hasDMA & rs);};#endif //PRO1_DMA_H
#include "dma.h"#include <cstring>using namespace std;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;}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 & operator<<(ostream & os, const baseDMA & rs){    os << "Label: " << rs.label << endl;    os << "Rating: " << rs.rating << endl;    return os;}lacksDMA::lacksDMA(const char * c, const char *l, int r) : baseDMA(l, r) {    strncpy(color, c, 39);    color[39] = '\0';}lacksDMA::lacksDMA(const char * c, const baseDMA &rs) : baseDMA(rs) {    strncpy(color, c, COL_LEN - 1);    color[COL_LEN - 1] = '\0';}hasDMA::~hasDMA() {    delete [] style;}hasDMA &hasDMA::operator=(const hasDMA &hs) {    if(this == &hs)        return *this;    baseDMA::operator=(hs);    style = new char[strlen(hs.style) + 1];    strcpy(style, hs.style);    return *this;}ostream & operator<<(ostream & os, const lacksDMA & ls){    os << (const baseDMA &) ls;    os << "Color: " << ls.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);}ostream & operator<<(ostream&os, const hasDMA & hs){    os << (const baseDMA &) hs;    os << "Style: " << hs.style << endl;    return os;}
#include <iostream>#include "module9_dynamic_memory_allocation_friend_inheritance/dma.h"using namespace std;void usedma(){    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;}int main() {    usedma();    return 0;}