标签:Name 遇到 Abstract 多态 C++ CPU class void public
学习C++多态时,练习的一个小题目。
第一次编写出来的代码如下
1 class Abstract_CPU 2 { 3 public: 4 virtual void Calculate() = 0; 5 }; 6 class Abstract_GPU 7 { 8 public: 9 virtual void Show() = 0; 10 }; 11 class Abstract_Memory 12 { 13 public: 14 virtual void Storage() = 0; 15 }; 16 17 class Inter : public Abstract_CPU, public Abstract_Memory 18 { 19 public: 20 void Calculate() 21 { 22 cout << "Inter的CPU开始计算" << endl; 23 } 24 void Storage() 25 { 26 cout << "Inter的内存条开始存储数据" << endl; 27 } 28 }; 29 class ROG : public Abstract_GPU, public Abstract_Memory 30 { 31 public: 32 void Show() 33 { 34 cout << "ROG的GPU开始显示" << endl; 35 } 36 void Storage() 37 { 38 cout << "ROG的内存条开始存储数据" << endl; 39 } 40 }; 41 42 class Computer 43 { 44 private: 45 Abstract_CPU* CPU = NULL; 46 Abstract_GPU* GPU = NULL; 47 Abstract_Memory* Memory = NULL; 48 public: 49 50 void work() 51 { 52 CPU->Calculate(); 53 GPU->Show(); 54 Memory->Storage(); 55 } 56 57 Computer(string CPU_Name, string GPU_Name, string Memory_Name) 58 { 59 if (CPU_Name == "Inter") 60 { 61 CPU = new Inter; 62 cout << "Inter CPU存储的地址:" << CPU << endl; 63 } 64 if (GPU_Name == "ROG") 65 { 66 GPU = new ROG; 67 cout << "ROG GPU存储的地址:" << GPU << endl; 68 } 69 if (Memory_Name == "Inter") 70 { 71 Memory = new Inter; 72 cout << "Inter Memory存储的地址:" << Memory << endl; 73 } 74 if (Memory_Name == "ROG") 75 { 76 Memory = new ROG; 77 cout << "ROG Memory存储的地址:" << Memory << endl; 78 } 79 } 80 ~Computer() 81 { 82 if (CPU != NULL) 83 { 84 delete (CPU); 85 CPU = NULL; 86 } 87 if (GPU != NULL) 88 { 89 delete (GPU); 90 GPU = NULL; 91 } 92 if (Memory != NULL) 93 { 94 delete (Memory); 95 Memory = NULL; 96 } 97 } 98 }; 99 100 void test01() 101 { 102 Computer computer("Inter", "ROG", "Inter"); 103 computer.work(); 104 } 105 106 107 int main() 108 { 109 test01(); 110 111 system("pause"); 112 return 0; 113 }
我运行这个代码的时候,第94行的指针delete时总是会出错。我就打印一下个各类的构造函数与析构函数的执行过程,发现我继承的子类没有被析构掉,我就想起来C++类默认的析构函数不是不是虚析构,而使用多态需要把基类建立虚析构,所以就把1-16行的基类中自己实现了一个虚析构,问题得以解决。 修改后的基类为:
class Abstract_CPU { public: virtual void Calculate() = 0; Abstract_CPU() { cout << "Abstract_CPU的构造函数" << endl; } virtual ~Abstract_CPU() { cout << "Abstract_CPU的析构函数" << endl; } }; class Abstract_GPU { public: virtual void Show() = 0; Abstract_GPU() { cout << "Abstract_GPU的构造函数" << endl; } virtual ~Abstract_GPU() { cout << "Abstract_GPU的析构函数" << endl; } }; class Abstract_Memory { public: virtual void Storage() = 0; Abstract_Memory() { cout << "Abstract_Memory的构造函数" << endl; } virtual ~Abstract_Memory() { cout << "Abstract_Memory的析构函数" << endl; } };
标签:Name,遇到,Abstract,多态,C++,CPU,class,void,public 来源: https://www.cnblogs.com/songmingze/p/16343761.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。