C++ //虚析构和纯虚析构

 1 //虚析构和纯虚析构
 2 
 3 #include <iostream>
 4 #include <string>
 5 using namespace std;
 6 
 7 class Animal
 8 {
 9 public:
10 
11     Animal()
12     {
13         cout << "Animal构造函数调用" << endl;
14     }
15     //虚析构
16     //利用虚析构可以解决 父类指针释放子类对象时 不干净的问题
17     
18     //virtual~Animal()
19     //{
20     //    cout << "Animal虚析构函数调用" << endl;
21 
22     //}
23 
24      //纯虚析构  和虚构只能有一个
25     virtual~Animal() = 0;
26 
27     //纯虚函数
28     virtual void speak() = 0;
29 };
30 //纯虚析构  和虚构只能有一个  需要声名和实现
31 //有了纯虚析构 之后  这个类也属于抽象类 无法实例化对象
32 Animal::~Animal()
33 {
34     cout << "Animal纯虚析构函数调用" << endl;
35 }
36 
37 class Cat :public Animal
38 {
39 public:
40 
41     Cat(string name)
42     {
43         cout << "Cat构造函数调用" << endl;
44         m_Name = new string(name);
45     }
46 
47 
48     virtual void speak()
49     {
50         cout << *m_Name<<"小猫在说话!" << endl;
51     }
52     ~Cat()
53     {
54         if (m_Name != NULL)
55         {
56             cout << "Cat析构函数调用" << endl;
57             delete m_Name;
58             m_Name = NULL;
59         }
60     }
61 
62     string *m_Name;
63 
64 };
65 void test01()
66 {
67     Animal* animal = new Cat("Tom");
68     animal->speak();
69     //父类指针在析构的时候 不会调用子类中析构函数 导致子类如果有
70     //堆区属性,出现内存泄漏
71     delete animal;
72 }
73 
74 int main()
75 {
76     test01();
77 
78 
79 
80     system("pause");
81 
82     return 0;
83 
84 }

 

 

 

 

posted on 2021-08-09 10:14  Bytezero!  阅读(38)  评论(0编辑  收藏  举报