ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++中使用多态时遇到的问题。

2022-06-05 13:02:21  阅读:127  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有