第13章 類繼承 13.11 編程練習 第二題 1頭文件源碼:"classic.h" 2 頭文件實現: ...
第13章 類繼承
13.11 編程練習
第二題
1頭文件源碼:"classic.h"
1 #ifndef CLASSIC_H_INCLUDED 2 #define CLASSIC_H_INCLUDED 3 4 class Cd 5 { 6 private: 7 char *performers; 8 char *label; 9 int selections; 10 double playtime; 11 public: 12 Cd(char * s1, char * s2, int n, double x); 13 Cd(); 14 Cd(const Cd & C); 15 virtual ~Cd(); 16 virtual void Report() const; 17 Cd & operator=(const Cd &d); 18 }; 19 20 class Classic : public Cd 21 { 22 private: 23 char *details; 24 public: 25 Classic(char * s0, char * s1, char * s2, int n, double x); 26 Classic() {} 27 Classic(const Classic & C); 28 Classic(char * s0, const Cd & d); 29 ~Classic(); 30 virtual void Report() const; 31 Classic & operator=(const Classic & C); 32 33 }; 34 35 #endif // CLASSIC_H_INCLUDED
2 頭文件實現:
1 #include <iostream> 2 #include <cstring> 3 #include "classic.h" 4 5 using std::cout; 6 using std::endl; 7 8 Cd::Cd(char * s1, char * s2, int n, double x) 9 { 10 int len1 = std::strlen(s1); 11 int len2= std::strlen(s2); 12 performers = new char[len1+1]; 13 label = new char[len2+1]; 14 std::strcpy(performers, s1); 15 std::strcpy(label, s2); 16 selections = n; 17 playtime = x; 18 } 19 20 Cd::Cd() 21 { 22 performers = 0; 23 label = 0; 24 selections = 0; 25 playtime = 0.0; 26 } 27 28 Cd::Cd(const Cd & C) 29 { 30 int len1 = std::strlen(C.performers); 31 int len2= std::strlen(C.label); 32 performers = new char[len1+1]; 33 label = new char[len2+1]; 34 std::strcpy(performers, C.performers); 35 std::strcpy(label, C.label); 36 selections = C.selections; 37 playtime = C.playtime; 38 } 39 Cd::~Cd() 40 { 41 delete [] performers; 42 delete [] label; 43 } 44 45 void Cd::Report() const 46 { 47 cout << "performers: " << performers << endl; 48 cout << "label: " << label << endl; 49 cout << "selection: " << selections << endl; 50 cout << "playtime: " << playtime << endl; 51 52 } 53 54 Cd & Cd::operator=(const Cd &C) 55 { 56 if(this == &C) 57 return *this; 58 int len1 = std::strlen(C.performers); 59 int len2= std::strlen(C.label); 60 performers = new char[len1+1]; 61 label = new char[len2+1]; 62 std::strcpy(performers, C.performers); 63 std::strcpy(label, C.label); 64 selections = C.selections; 65 playtime = C.playtime; 66 return *this; 67 } 68 69 70 Classic::Classic(char * s0, char * s1, char * s2, int n, double x):Cd(s1, s2, n, x) 71 { 72 int len = std::strlen(s0); 73 details = new char[len+1]; 74 std::strcpy(details, s0); 75 } 76 77 78 79 Classic::Classic(char * s0, const Cd &C):Cd(C) 80 { 81 details = new char[std::strlen(s0)+1]; 82 std::strcpy(details, s0); 83 } 84 85 Classic::Classic(const Classic & C):Cd(C) 86 { 87 int len = std::strlen(C.details); 88 details = new char[len+1]; 89 std::strcpy(details, C.details); 90 } 91 92 Classic::~Classic() 93 { 94 delete [] details; 95 } 96 97 void Classic::Report() const 98 { 99 Cd::Report(); 100 cout << "details: " << details << endl; 101 } 102 103 Classic & Classic::operator=(const Classic & C) 104 { 105 if(this == &C) 106 return *this; 107 Cd::operator=(C); 108 delete [] details; 109 int len = std::strlen(C.details); 110 details = new char[len+1]; 111 std::strcpy(details, C.details); 112 return *this; 113 }